cadencii.PluginLoader.compileScript C# (CSharp) Method

compileScript() public method

public compileScript ( string code, List errors ) : Assembly
code string
errors List
return System.Reflection.Assembly
        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