public async Task <TReturn> Execute <TReturn>(string dllPath) { var runtimeDeps = ScriptCompiler.RuntimeDependencyResolver.GetDependencies(dllPath); var runtimeDepsMap = ScriptCompiler.CreateScriptDependenciesMap(runtimeDeps); var assembly = Assembly.LoadFrom(dllPath); // this needs to be called prior to 'AppDomain.CurrentDomain.AssemblyResolve' event handler added AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var assemblyName = new AssemblyName(args.Name); var result = runtimeDepsMap.TryGetValue(assemblyName.Name, out RuntimeAssembly runtimeAssembly); if (!result) { throw new Exception($"Unable to locate assembly '{assemblyName.Name}: {assemblyName.Version}'"); } var loadedAssembly = Assembly.LoadFrom(runtimeAssembly.Path); return(loadedAssembly); }; var type = assembly.GetType("Submission#0"); var method = type.GetMethod("<Factory>", BindingFlags.Static | BindingFlags.Public); var submissionStates = new object[2]; submissionStates[0] = new CommandLineScriptGlobals(ScriptConsole.Out, CSharpObjectFormatter.Instance); var resultTask = method.Invoke(null, new[] { submissionStates }) as Task <TReturn>; return(await resultTask); }
private void RunScript(Script <object> script, CommandLineScriptGlobals globals) { var scriptState = script.RunAsync(globals, exception => true).Result; if (scriptState.Exception != null) { logger.LogError(scriptState.Exception.ToString()); throw scriptState.Exception; } }
public Task <TReturn> Execute <TReturn>(ScriptContext context) { var globals = new CommandLineScriptGlobals(Console.Out, CSharpObjectFormatter.Instance); foreach (var arg in context.Args) { globals.Args.Add(arg); } return(Execute <TReturn, CommandLineScriptGlobals>(context, globals)); }
public void Execute(string pathToScript, string[] args) { //LoadLibrary( // @"C:\Users\bri\.nuget\packages\runtime.win7-x64.runtime.native.system.data.sqlclient.sni\4.3.0\runtimes\win7-x64\native\sni.dll"); if (!Path.IsPathRooted(pathToScript)) { pathToScript = Path.GetFullPath(pathToScript); } string codeAsPlainText = null; using (var fileStream = new FileStream(pathToScript, FileMode.Open)) { // We need to create a SourceText instance with an encoding var encodedSourceText = SourceText.From(fileStream, Encoding.UTF8); codeAsPlainText = encodedSourceText.ToString(); } var scriptOptions = CreateScriptOptions(pathToScript); var globals = new CommandLineScriptGlobals(Console.Out, CSharpObjectFormatter.Instance); foreach (var arg in args) { globals.Args.Add(arg); } logger.LogInformation("Creating script"); var interactiveAssemblyLoader = new InteractiveAssemblyLoader(); var script = CSharpScript.Create(codeAsPlainText, scriptOptions, typeof(CommandLineScriptGlobals), interactiveAssemblyLoader); var warnings = script.GetCompilation().GetDiagnostics() .Where(d => d.Severity == DiagnosticSeverity.Warning); foreach (var warning in warnings) { logger.LogWarning(warning.ToString()); } var errors = script.GetCompilation().GetDiagnostics() .Where(d => d.Severity == DiagnosticSeverity.Error); foreach (var error in errors) { logger.LogError(error.ToString()); } RunScript(script, globals); }
public async Task <TReturn> Execute <TReturn>(string dllPath, IEnumerable <string> commandLineArgs) { var runtimeDeps = ScriptCompiler.RuntimeDependencyResolver.GetDependenciesForLibrary(dllPath); var runtimeDepsMap = ScriptCompiler.CreateScriptDependenciesMap(runtimeDeps); var assembly = Assembly.LoadFrom(dllPath); // this needs to be called prior to 'AppDomain.CurrentDomain.AssemblyResolve' event handler added try { //var p = runtimeDepsMap["System.Drawing.Common"].Path; //Console.WriteLine(p); //var a2 = Assembly.Load("System.Drawing.Common"); //var a3 = Assembly.LoadFrom(runtimeDepsMap["System.Drawing.Common"].Path); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => ResolveAssembly(args, runtimeDepsMap); var type = assembly.GetType("Submission#0"); var method = type.GetMethod("<Factory>", BindingFlags.Static | BindingFlags.Public); var globals = new CommandLineScriptGlobals(ScriptConsole.Out, CSharpObjectFormatter.Instance); foreach (var arg in commandLineArgs) { globals.Args.Add(arg); } var submissionStates = new object[2]; submissionStates[0] = globals; var resultTask = method.Invoke(null, new[] { submissionStates }) as Task <TReturn>; try { _ = await resultTask; } catch (System.Exception ex) { ScriptConsole.WriteError(ex.ToString()); throw new ScriptRuntimeException("Script execution resulted in an exception.", ex); } return(await resultTask); }
public async Task <TReturn> Execute <TReturn>(string dllPath, IEnumerable <string> commandLineArgs) { var runtimeDeps = ScriptCompiler.RuntimeDependencyResolver.GetDependenciesForLibrary(dllPath); var runtimeDepsMap = ScriptCompiler.CreateScriptDependenciesMap(runtimeDeps); var assembly = Assembly.LoadFrom(dllPath); // this needs to be called prior to 'AppDomain.CurrentDomain.AssemblyResolve' event handler added AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var assemblyName = new AssemblyName(args.Name); var result = runtimeDepsMap.TryGetValue(assemblyName.Name, out RuntimeAssembly runtimeAssembly); if (!result) { throw new Exception($"Unable to locate assembly '{assemblyName.Name}: {assemblyName.Version}'"); } var loadedAssembly = Assembly.LoadFrom(runtimeAssembly.Path); return(loadedAssembly); }; var type = assembly.GetType("Submission#0"); var method = type.GetMethod("<Factory>", BindingFlags.Static | BindingFlags.Public); var globals = new CommandLineScriptGlobals(ScriptConsole.Out, CSharpObjectFormatter.Instance); foreach (var arg in commandLineArgs) { globals.Args.Add(arg); } var submissionStates = new object[2]; submissionStates[0] = globals; var resultTask = method.Invoke(null, new[] { submissionStates }) as Task <TReturn>; TReturn returnValue; try { returnValue = await resultTask; } catch (System.Exception ex) { ScriptConsole.WriteError(ex.ToString()); throw new ScriptRuntimeException("Script execution resulted in an exception.", ex); } return(await resultTask); }