コード例 #1
0
        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);
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
ファイル: ScriptRunner.cs プロジェクト: zyj0021/dotnet-script
        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);
        }