public Assembly compileScript( string code, List<string> errors )
{
Assembly ret = null;
String md5 = PortUtil.getMD5FromString( code ).Replace( "_", "" );
String cached_asm_file = Path.Combine( Utility.getCachedAssemblyPath(), md5 + ".dll" );
bool compiled = false;
if ( File.Exists( cached_asm_file ) ) {
ret = Assembly.LoadFile( cached_asm_file );
if ( !isValidCachedAssembly( ret ) ){
ret = null;
usedAssemblyChache.Remove( cached_asm_file );
}
if ( ret != null ) {
if ( !usedAssemblyChache.Contains( cached_asm_file ) ) {
usedAssemblyChache.Add( cached_asm_file );
}
}
}
CompilerResults cr = null;
if ( ret == null ) {
CSharpCodeProvider provider = new CSharpCodeProvider();
String path = System.Windows.Forms.Application.StartupPath;
if ( System.IO.Path.GetFileName( System.Windows.Forms.Application.ExecutablePath ).ToLower().StartsWith( "nunit" ) ) {
// nunit の場合は、 StartupPath が nunit のものになってしまうため、
// CadenciiTest.dll がデプロイされているディレクトリを、アセンブリのロード起点とする。
foreach ( var asm in AppDomain.CurrentDomain.GetAssemblies() ) {
if ( System.IO.Path.GetFileName( asm.Location ).ToLower() == "cadenciitest.dll" ) {
path = System.IO.Path.GetDirectoryName( asm.Location );
break;
}
}
}
CompilerParameters parameters = new CompilerParameters( new String[] {
Path.Combine( path, "cadencii.vsq.dll" ),
Path.Combine( path, "Cadencii.exe" ),
Path.Combine( path, "cadencii.media.dll" ),
Path.Combine( path, "cadencii.apputil.dll" ),
Path.Combine( path, "cadencii.windows.forms.dll" ),
Path.Combine( path, "cadencii.core.dll" )
} );
parameters.ReferencedAssemblies.Add( "System.Windows.Forms.dll" );
parameters.ReferencedAssemblies.Add( "System.dll" );
parameters.ReferencedAssemblies.Add( "System.Drawing.dll" );
parameters.ReferencedAssemblies.Add( "System.Xml.dll" );
parameters.GenerateInMemory = false;
parameters.GenerateExecutable = false;
parameters.IncludeDebugInformation = true;
try {
cr = provider.CompileAssemblyFromSource( parameters, code );
ret = cr.CompiledAssembly;
compiled = true;
} catch ( Exception ex ) {
serr.println( "Utility#compileScript; ex=" + ex );
Logger.write( typeof( Utility ) + ".compileScript; ex=" + ex + "\n" );
}
if ( !compiled ) {
int c = cr.Errors.Count;
for ( int i = 0; i < c; i++ ) {
errors.Add( _( "line" ) + ":" + cr.Errors[i].Line + " " + cr.Errors[i].ErrorText );
}
}
}
if ( compiled ) {
if ( !usedAssemblyChache.Contains( cached_asm_file ) ) {
usedAssemblyChache.Add( cached_asm_file );
}
if ( File.Exists( cached_asm_file ) ) {
try {
PortUtil.deleteFile( cached_asm_file );
} catch ( Exception ex ) {
serr.println( "Utility#compileScript; ex=" + ex );
Logger.write( typeof( Utility ) + ".compileScript; ex=" + ex + "\n" );
}
}
try {
PortUtil.copyFile( cr.PathToAssembly, cached_asm_file );
} catch ( Exception ex ) {
serr.println( "Utility#compileScript; ex=" + ex );
Logger.write( typeof( Utility ) + ".compileScript; ex=" + ex + "\n" );
}
}
return ret;
}
#endif // ENABLE_SCRIPT