public PropertiesInjector(ILibraryAsPropertiesLoader loader, string info) { Loader = loader; Info = info; }
public AspNetHostEngine( List <System.Reflection.Assembly> assembliesForAttaching, List <PropertiesInjectorInfo> propertiesInjectorsInfo, System.Collections.Hashtable commonModulesForLoading ) { System.Collections.Specialized.NameValueCollection appSettings = System.Web.Configuration.WebConfigurationManager.AppSettings; _hostedScript = new HostedScriptEngine(); // метод настраивает внутренние переменные у SystemGlobalContext if (appSettings["enableEcho"] == "true") { _hostedScript.SetGlobalEnvironment(new ASPNetApplicationHost(), new AspEntryScriptSrc(appSettings["startupScript"] ?? HttpContext.Current.Server.MapPath("~/web.config"))); } else { _hostedScript.SetGlobalEnvironment(new AspNetNullApplicationHost(), new AspNetNullEntryScriptSrc()); } _hostedScript.Initialize(); // Размещаем oscript.cfg вместе с web.config. Так наверное привычнее _hostedScript.CustomConfig = appSettings["configFilePath"] ?? System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "oscript.cfg"); // Аттачим доп сборки. По идее должны лежать в Bin foreach (System.Reflection.Assembly assembly in assembliesForAttaching) { _hostedScript.AttachAssembly(assembly); } // Добавляем свойства для общих модулей foreach (System.Collections.DictionaryEntry cm in commonModulesForLoading) { _hostedScript.InjectGlobalProperty((string)cm.Key, ValueFactory.Create(), true); } // Загружаем классы инжекторов свойств List <PropertiesInjector> propertiesInjectors = new List <PropertiesInjector>(); foreach (PropertiesInjectorInfo ci in propertiesInjectorsInfo) { ILibraryAsPropertiesLoader instance = (ILibraryAsPropertiesLoader)(Activator.CreateInstance(ci.AssemblyName, ci.ClassName).Unwrap()); propertiesInjectors.Add(new PropertiesInjector(instance, ci.Info)); } // Получаем и вставляем списки свойств. Класс инжектора должен иметь метод GetPropertyNamesForInjecting foreach (PropertiesInjector injector in propertiesInjectors) { List <string> propertiesNames = injector.Loader.GetPropertiesNamesForInjecting(injector.Info); foreach (string cp in propertiesNames) { _hostedScript.InjectGlobalProperty(cp, ValueFactory.Create(), true); } } // Подключаем общие модули foreach (System.Collections.DictionaryEntry cm in commonModulesForLoading) { ICodeSource src = _hostedScript.Loader.FromString((string)cm.Value); var compilerService = _hostedScript.GetCompilerService(); var module = compilerService.CreateModule(src); var loaded = _hostedScript.EngineInstance.LoadModuleImage(module); var instance = (IValue)_hostedScript.EngineInstance.NewObject(loaded); _hostedScript.EngineInstance.Environment.SetGlobalProperty((string)cm.Key, instance); } // Присваиваем значения свойств foreach (PropertiesInjector injector in propertiesInjectors) { injector.Loader.AssignPropertiesValues(_hostedScript); } _hostedScript.EngineInstance.Environment.LoadMemory(MachineInstance.Current); }