private LoadedModuleHandle LoadByteCode(string filePath, AspNetHostEngine _eng) { var code = _eng.Engine.EngineInstance.Loader.FromFile(filePath); var compiler = _eng.Engine.GetCompilerService(); var byteCode = compiler.CreateModule(code); var module = _eng.Engine.EngineInstance.LoadModuleImage(byteCode); return(module); }
private void CallScriptHandler(HttpContext context, AspNetHostEngine _eng) { #region Загружаем скрипт (файл .os) // Кэшируем исходный файл, если файл изменился (изменили скрипт .os) загружаем заново // В Linux под Mono не работает подписка на изменение файла. LoadedModuleHandle?module = null; MemoryCache cache = MemoryCache.Default; if (_cachingEnabled) { module = cache[context.Request.PhysicalPath] as LoadedModuleHandle?; if (module == null) { // Загружаем файл и помещаем его в кэш if (!System.IO.File.Exists(context.Request.PhysicalPath)) { context.Response.StatusCode = 404; return; } module = LoadByteCode(context.Request.PhysicalPath, _eng); CacheItemPolicy policy = new CacheItemPolicy(); List <string> filePaths = new List <string>(); filePaths.Add(context.Request.PhysicalPath); policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); cache.Set(context.Request.PhysicalPath, module, policy); } } else { if (!System.IO.File.Exists(context.Request.PhysicalPath)) { context.Response.StatusCode = 404; return; } module = LoadByteCode(context.Request.PhysicalPath, _eng); } #endregion var runner = CreateServiceInstance(module.Value, _eng); ProduceResponse(context, runner); }
private IRuntimeContextInstance CreateServiceInstance(LoadedModuleHandle module, AspNetHostEngine _eng) { var runner = _eng.Engine.EngineInstance.NewObject(module); return(runner); }