protected override void SetCustomOption(String name, Object value){
   try{
     if (String.Compare(name, "CLSCompliant", StringComparison.OrdinalIgnoreCase) == 0)
       this.isCLSCompliant = (bool)value;
     else if (String.Compare(name, "fast", StringComparison.OrdinalIgnoreCase) == 0)
       this.doFast = (bool)value;
     else if (String.Compare(name, "output", StringComparison.OrdinalIgnoreCase) == 0){
       if (value is String){
         this.PEFileName = (String)value;
         this.doSaveAfterCompile = true;
       }
     }else if (String.Compare(name, "PEFileKind", StringComparison.OrdinalIgnoreCase) == 0)
       this.PEFileKind = (PEFileKinds)value;
     else if (String.Compare(name, "PortableExecutableKind", StringComparison.OrdinalIgnoreCase) == 0)
       this.PEKindFlags = (PortableExecutableKinds)value;
     else if (String.Compare(name, "ImageFileMachine", StringComparison.OrdinalIgnoreCase) == 0)
       this.PEMachineArchitecture = (ImageFileMachine)value;
     else if (String.Compare(name, "ReferenceLoaderAPI", StringComparison.OrdinalIgnoreCase) == 0) {
       String loaderAPI = (string)value;
       if (String.Compare(loaderAPI, "LoadFrom", StringComparison.OrdinalIgnoreCase) == 0)
         this.ReferenceLoaderAPI = LoaderAPI.LoadFrom;
       else if (String.Compare(loaderAPI, "LoadFile", StringComparison.OrdinalIgnoreCase) == 0)
         this.ReferenceLoaderAPI = LoaderAPI.LoadFile;
       else if (String.Compare(loaderAPI, "ReflectionOnlyLoadFrom", StringComparison.OrdinalIgnoreCase) == 0)
         this.ReferenceLoaderAPI = LoaderAPI.ReflectionOnlyLoadFrom;
       else
         throw new VsaException(VsaError.OptionInvalid);
     }        
     else if (String.Compare(name, "print", StringComparison.OrdinalIgnoreCase) == 0)
       this.doPrint = (bool)value;
     else if (String.Compare(name, "UseContextRelativeStatics", StringComparison.OrdinalIgnoreCase) == 0)
       this.doCRS = (bool)value;
       // the next two are needed because of the ICompiler interface. They should not fail even though they may not do anything
     else if (String.Compare(name, "optimize", StringComparison.OrdinalIgnoreCase) == 0)
       return;
     else if (String.Compare(name, "define", StringComparison.OrdinalIgnoreCase) == 0)
       return;
     else if (String.Compare(name, "defines", StringComparison.OrdinalIgnoreCase) == 0)
       this.Defines = (Hashtable)value;
     else if (String.Compare(name, "ee", StringComparison.OrdinalIgnoreCase) == 0)
       VsaEngine.executeForJSEE = (Boolean)value;
     else if (String.Compare(name, "version", StringComparison.OrdinalIgnoreCase) == 0)
       this.versionInfo = (Version)value;
     else if (String.Compare(name, "VersionSafe", StringComparison.OrdinalIgnoreCase) == 0)
       this.versionSafe = (Boolean)value;
     else if (String.Compare(name, "libpath", StringComparison.OrdinalIgnoreCase) == 0)
       this.libpath = (String)value;
     else if (String.Compare(name, "warnaserror", StringComparison.OrdinalIgnoreCase) == 0)
       this.doWarnAsError = (bool)value;
     else if (String.Compare(name, "WarningLevel", StringComparison.OrdinalIgnoreCase) == 0)
       this.nWarningLevel = (int)value;
     else if (String.Compare(name, "managedResources", StringComparison.OrdinalIgnoreCase) == 0)
       this.managedResources = (ICollection)value;
     else if (String.Compare(name, "alwaysGenerateIL", StringComparison.OrdinalIgnoreCase) == 0)
       this.alwaysGenerateIL = (bool)value;
     else if (String.Compare(name, "DebugDirectory", StringComparison.OrdinalIgnoreCase) == 0){
       // use null to turn off SaveSourceState source generation
       if (value == null){
         this.debugDirectory = null;
         return;
       }
       string dir = value as string;
       if (dir == null)
         throw new VsaException(VsaError.OptionInvalid);
       try{
         dir = Path.GetFullPath(dir + Path.DirectorySeparatorChar);
         if (!Directory.Exists(dir))
           Directory.CreateDirectory(dir);
       }catch(Exception e){
         // we couldn't create the specified directory
         throw new VsaException(VsaError.OptionInvalid, "", e);
       }catch{
         // we couldn't create the specified directory
         throw new VsaException(VsaError.OptionInvalid);
       }
       this.debugDirectory = dir;
     }else if (String.Compare(name, "AutoRef", StringComparison.OrdinalIgnoreCase) == 0)
       this.autoRef = (bool)value;
     else
       throw new VsaException(VsaError.OptionNotSupported);
   }catch(VsaException){
     throw;
   }catch{
     throw new VsaException(VsaError.OptionInvalid);
   }
 }
 /// <summary>
 /// Initializes the <see cref="PluginManager"/>
 /// </summary>
 /// <param name="loader">Instance of the mod loader.</param>
 /// <param name="sharedContext">Used only for testing. Sets shared load context used for plugins.</param>
 public PluginManager(Loader loader, LoadContext sharedContext = null)
 {
     _loader        = loader;
     LoaderApi      = new LoaderAPI(_loader);
     _sharedContext = sharedContext ?? LoadContext.BuildSharedLoadContext();
 }
      public VsaEngine(bool fast) : base("JScript", VsaEngine.engineVersion, true){
        this.alwaysGenerateIL = false;
        this.autoRef = false;
        this.doCRS = false;
        this.doFast = fast;
        this.genDebugInfo = false;
        this.genStartupClass = true;
        this.doPrint = false;
        this.doWarnAsError = false;
        this.nWarningLevel = 4;
        this.isCLSCompliant = false;
        this.versionSafe = false;
        this.PEFileName = null;
        this.PEFileKind = PEFileKinds.Dll;
        this.PEKindFlags = PortableExecutableKinds.ILOnly;
        this.PEMachineArchitecture = ImageFileMachine.I386;
        this.ReferenceLoaderAPI = LoaderAPI.LoadFrom;
        this.errorCultureInfo = null;
        this.libpath = null;
        this.libpathList = null;

        this.globalScope = null;
        this.vsaItems = new VsaItems(this);
        this.packages = null;
        this.scopes = null;
        this.classCounter = 0;
        this.implicitAssemblies = null;
        this.implicitAssemblyCache = null;
        this.cachedTypeLookups = null;

        this.isEngineRunning = false;
        this.isEngineCompiled = false;
        this.isCompilerSet = false;
        this.isClosed = false;

        this.runningThread = null;
        this.compilerGlobals = null;
        this.globals = null;
        this.runtimeDirectory = null;
        Globals.contextEngine = this;
        this.runtimeAssembly = null;
        this.typenameTable = null;
      }
 protected override void SetCustomOption(string name, object value)
 {
     try
     {
         if (string.Compare(name, "CLSCompliant", StringComparison.OrdinalIgnoreCase) == 0)
         {
             this.isCLSCompliant = (bool) value;
         }
         else if (string.Compare(name, "fast", StringComparison.OrdinalIgnoreCase) == 0)
         {
             this.doFast = (bool) value;
         }
         else if (string.Compare(name, "output", StringComparison.OrdinalIgnoreCase) == 0)
         {
             if (value is string)
             {
                 this.PEFileName = (string) value;
                 this.doSaveAfterCompile = true;
             }
         }
         else if (string.Compare(name, "PEFileKind", StringComparison.OrdinalIgnoreCase) == 0)
         {
             this.PEFileKind = (PEFileKinds) value;
         }
         else if (string.Compare(name, "PortableExecutableKind", StringComparison.OrdinalIgnoreCase) == 0)
         {
             this.PEKindFlags = (PortableExecutableKinds) value;
         }
         else if (string.Compare(name, "ImageFileMachine", StringComparison.OrdinalIgnoreCase) == 0)
         {
             this.PEMachineArchitecture = (ImageFileMachine) value;
         }
         else if (string.Compare(name, "ReferenceLoaderAPI", StringComparison.OrdinalIgnoreCase) == 0)
         {
             string strA = (string) value;
             if (string.Compare(strA, "LoadFrom", StringComparison.OrdinalIgnoreCase) != 0)
             {
                 if (string.Compare(strA, "LoadFile", StringComparison.OrdinalIgnoreCase) != 0)
                 {
                     if (string.Compare(strA, "ReflectionOnlyLoadFrom", StringComparison.OrdinalIgnoreCase) != 0)
                     {
                         throw new JSVsaException(JSVsaError.OptionInvalid);
                     }
                     this.ReferenceLoaderAPI = LoaderAPI.ReflectionOnlyLoadFrom;
                 }
                 else
                 {
                     this.ReferenceLoaderAPI = LoaderAPI.LoadFile;
                 }
             }
             else
             {
                 this.ReferenceLoaderAPI = LoaderAPI.LoadFrom;
             }
         }
         else if (string.Compare(name, "print", StringComparison.OrdinalIgnoreCase) == 0)
         {
             this.doPrint = (bool) value;
         }
         else if (string.Compare(name, "UseContextRelativeStatics", StringComparison.OrdinalIgnoreCase) == 0)
         {
             this.doCRS = (bool) value;
         }
         else if ((string.Compare(name, "optimize", StringComparison.OrdinalIgnoreCase) != 0) && (string.Compare(name, "define", StringComparison.OrdinalIgnoreCase) != 0))
         {
             if (string.Compare(name, "defines", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.Defines = (Hashtable) value;
             }
             else if (string.Compare(name, "ee", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 executeForJSEE = (bool) value;
             }
             else if (string.Compare(name, "version", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.versionInfo = (Version) value;
             }
             else if (string.Compare(name, "VersionSafe", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.versionSafe = (bool) value;
             }
             else if (string.Compare(name, "libpath", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.libpath = (string) value;
             }
             else if (string.Compare(name, "warnaserror", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.doWarnAsError = (bool) value;
             }
             else if (string.Compare(name, "WarningLevel", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.nWarningLevel = (int) value;
             }
             else if (string.Compare(name, "win32resource", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.win32resource = (string) value;
             }
             else if (string.Compare(name, "managedResources", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.managedResources = (ICollection) value;
             }
             else if (string.Compare(name, "alwaysGenerateIL", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 this.alwaysGenerateIL = (bool) value;
             }
             else if (string.Compare(name, "DebugDirectory", StringComparison.OrdinalIgnoreCase) == 0)
             {
                 if (value == null)
                 {
                     this.debugDirectory = null;
                 }
                 else
                 {
                     string path = value as string;
                     if (path == null)
                     {
                         throw new JSVsaException(JSVsaError.OptionInvalid);
                     }
                     try
                     {
                         path = Path.GetFullPath(path + Path.DirectorySeparatorChar);
                         if (!Directory.Exists(path))
                         {
                             Directory.CreateDirectory(path);
                         }
                     }
                     catch (Exception exception)
                     {
                         throw new JSVsaException(JSVsaError.OptionInvalid, "", exception);
                     }
                     this.debugDirectory = path;
                 }
             }
             else
             {
                 if (string.Compare(name, "AutoRef", StringComparison.OrdinalIgnoreCase) != 0)
                 {
                     throw new JSVsaException(JSVsaError.OptionNotSupported);
                 }
                 this.autoRef = (bool) value;
             }
         }
     }
     catch (JSVsaException)
     {
         throw;
     }
     catch
     {
         throw new JSVsaException(JSVsaError.OptionInvalid);
     }
 }