internal DlrConfiguration ToConfiguration() { ContractUtils.Requires(_languageSetups.Count > 0, "ScriptRuntimeSetup must have at least one LanguageSetup"); // prepare ReadOnlyCollection <LanguageSetup> setups = new ReadOnlyCollection <LanguageSetup>(ArrayUtils.MakeArray(_languageSetups)); var hostArguments = new ReadOnlyCollection <object>(ArrayUtils.MakeArray(_hostArguments)); var options = new ReadOnlyDictionary <string, object>(new Dictionary <string, object>(_options)); var config = new DlrConfiguration(_debugMode, _privateBinding, options); // validate foreach (var language in setups) { config.AddLanguage( language.TypeName, language.DisplayName, language.Names, language.FileExtensions, language.Options ); } // commit _languageSetups = setups; _options = options; _hostArguments = hostArguments; Freeze(setups); return(config); }
/// <summary> /// Creates ScriptRuntime in the current app-domain and initialized according to the the specified settings. /// Creates an instance of host class specified in the setup and associates it with the created runtime. /// Both Runtime and ScriptHost are collocated in the current app-domain. /// </summary> public ScriptRuntime(ScriptRuntimeSetup setup) { ContractUtils.RequiresNotNull(setup, "setup"); // Do this first, so we detect configuration errors immediately DlrConfiguration config = setup.ToConfiguration(); _setup = setup; _host = ReflectionUtils.CreateInstance <ScriptHost>(setup.HostType, setup.HostArguments.ToArray <object>()); ScriptHostProxy hostProxy = new ScriptHostProxy(_host); _manager = new ScriptDomainManager(hostProxy, config); _invariantContext = new InvariantContext(_manager); _io = new ScriptIO(_manager.SharedIO); _engines = new Dictionary <LanguageContext, ScriptEngine>(); bool freshEngineCreated; _globals = new ScriptScope(GetEngineNoLockNoNotification(_invariantContext, out freshEngineCreated), _manager.Globals); // runtime needs to be all set at this point, host code is called _host.SetRuntime(this); }
/// <summary> /// Creates ScriptRuntime in the current app-domain and initialized according to the the specified settings. /// Creates an instance of host class specified in the setup and associates it with the created runtime. /// Both Runtime and ScriptHost are collocated in the current app-domain. /// </summary> public ScriptRuntime(ScriptRuntimeSetup setup) { ContractUtils.RequiresNotNull(setup, "setup"); // Do this first, so we detect configuration errors immediately DlrConfiguration config = setup.ToConfiguration(); _setup = setup; try { _host = (ScriptHost)Activator.CreateInstance(setup.HostType, setup.HostArguments.ToArray <object>()); } catch (TargetInvocationException e) { throw new InvalidImplementationException(Strings.InvalidCtorImplementation(setup.HostType, e.InnerException.Message), e.InnerException); } catch (Exception e) { throw new InvalidImplementationException(Strings.InvalidCtorImplementation(setup.HostType, e.Message), e); } ScriptHostProxy hostProxy = new ScriptHostProxy(_host); _manager = new ScriptDomainManager(hostProxy, config); _invariantContext = new InvariantContext(_manager); _io = new ScriptIO(_manager.SharedIO); _engines = new Dictionary <LanguageContext, ScriptEngine>(); bool freshEngineCreated; _globals = new ScriptScope(GetEngineNoLockNoNotification(_invariantContext, out freshEngineCreated), _manager.Globals); // runtime needs to be all set at this point, host code is called _host.SetRuntime(this); object noDefaultRefs; if (!setup.Options.TryGetValue("NoDefaultReferences", out noDefaultRefs) || Convert.ToBoolean(noDefaultRefs) == false) { LoadAssembly(typeof(string).GetTypeInfo().Assembly); LoadAssembly(typeof(System.Diagnostics.Debug).GetTypeInfo().Assembly); } }