private void LoadScripts(HostedScriptEngine engine, UserAddedScript[] scripts) { var binaryIndexer = new CompiledCodeIndexer(); var module = scripts[0].Image; module.ModuleInfo.CodeIndexer = binaryIndexer; scripts .Skip(1) .Where(x => x.Type == UserAddedScriptType.Module) .OrderBy(x => x.InjectOrder) .ForEach(x => { x.Image.ModuleInfo.CodeIndexer = binaryIndexer; engine.EngineInstance.Environment.InjectGlobalProperty(null, x.Symbol, true); }); foreach (var userAddedScript in scripts.Skip(1).Where(x => x.Type == UserAddedScriptType.Class)) { userAddedScript.Image.ModuleInfo.CodeIndexer = binaryIndexer; engine.LoadUserScript(userAddedScript); } scripts .Skip(1) .Where(x => x.Type == UserAddedScriptType.Module) .ForEach(x => { var loaded = engine.EngineInstance.LoadModuleImage(x.Image); var instance = engine.EngineInstance.CreateUninitializedSDO(loaded); engine.EngineInstance.Environment.SetGlobalProperty(x.Symbol, instance); engine.EngineInstance.InitializeSDO(instance); }); }
public int Run() { if (_sourceStream == null && CommandLineArguments != null && CommandLineArguments.Length > 1) { var firstArg = CommandLineArguments[0]; if (firstArg == "-loadDump") { var path = CommandLineArguments[1]; CommandLineArguments = CommandLineArguments.Skip(2).ToArray(); using (var dumpStream = new FileStream(path, FileMode.Open)) { _sourceStream = GetCodeStream(dumpStream); } return(Run()); //ну да, говнокод и лапша, время жмет } } if (_sourceStream == null) { _sourceStream = LocateCode(); } var engine = new HostedScriptEngine(); var src = new BinaryCodeSource(); engine.SetGlobalEnvironment(this, src); try { var templateStorage = new TemplateStorage(new StandaloneTemplateFactory()); engine.InitializationCallback = (e, env) => { e.Environment.InjectObject(templateStorage); GlobalsManager.RegisterInstance(templateStorage); }; engine.Initialize(); var serializer = new BinaryFormatter(); var appDump = (ApplicationDump)serializer.Deserialize(_sourceStream); foreach (var resource in appDump.Resources) { templateStorage.RegisterTemplate(resource.ResourceName, DeserializeTemplate(resource.Data)); } var module = appDump.Scripts[0].Image; var binaryIndexer = new CompiledCodeIndexer(); module.ModuleInfo.CodeIndexer = binaryIndexer; for (int i = 1; i < appDump.Scripts.Length; i++) { appDump.Scripts[i].Image.ModuleInfo.CodeIndexer = binaryIndexer; engine.LoadUserScript(appDump.Scripts[i]); } var process = engine.CreateProcess(this, module, src); return(process.Start()); } catch (ScriptInterruptionException e) { return(e.ExitCode); } catch (Exception e) { ShowExceptionInfo(e); return(1); } }