Esempio n. 1
0
        public virtual ScriptEmitResult Emit <TReturn, THost>(ScriptContext context)
        {
            try
            {
                var compilationContext = _scriptCompiler.CreateCompilationContext <TReturn, THost>(context);

                var compilation = compilationContext.Script.GetCompilation();

                var         peStream    = new MemoryStream();
                EmitOptions emitOptions = null;
                if (context.OptimizationLevel == Microsoft.CodeAnalysis.OptimizationLevel.Debug)
                {
                    emitOptions = new EmitOptions()
                                  .WithDebugInformationFormat(DebugInformationFormat.Embedded);
                }

                var result = compilation.Emit(peStream, options: emitOptions);

                if (result.Success)
                {
                    return(new ScriptEmitResult(peStream, compilation.DirectiveReferences, compilationContext.RuntimeDependencies));
                }

                return(ScriptEmitResult.Error(result.Diagnostics));
            }
            catch (CompilationErrorException e)
            {
                foreach (var diagnostic in e.Diagnostics)
                {
                    _scriptConsole.WriteError(diagnostic.ToString());
                }

                throw;
            }
        }
        public virtual async Task <TReturn> Execute <TReturn, THost>(ScriptContext context, THost host)
        {
            var compilationContext = ScriptCompiler.CreateCompilationContext <TReturn, THost>(context);

            var scriptResult = await compilationContext.Script.RunAsync(host).ConfigureAwait(false);

            return(ProcessScriptState(scriptResult));
        }
        private async Task RunFirstScript(ScriptContext scriptContext)
        {
            var compilationContext = ScriptCompiler.CreateCompilationContext <object, InteractiveScriptGlobals>(scriptContext);

            _scriptState = await compilationContext.Script.RunAsync(_globals, ex => true).ConfigureAwait(false);

            _scriptOptions = compilationContext.ScriptOptions;
        }
Esempio n. 4
0
        public virtual Task <TReturn> Execute <TReturn, THost>(ScriptContext context, THost host)
        {
            var compilationContext = ScriptCompiler.CreateCompilationContext <TReturn, THost>(context);

            ScriptConsole.WriteDiagnostics(compilationContext.Warnings, compilationContext.Errors);

            if (compilationContext.Errors.Any())
            {
                throw new CompilationErrorException("Script compilation failed due to one or more errors.", compilationContext.Errors.ToImmutableArray());
            }

            return(Execute(compilationContext, host));
        }
Esempio n. 5
0
        public virtual Task <TReturn> Execute <TReturn, THost>(ScriptContext context, THost host)
        {
            try
            {
                var compilationContext = ScriptCompiler.CreateCompilationContext <TReturn, THost>(context);
                return(Execute(compilationContext, host));
            }
            catch (CompilationErrorException e)
            {
                foreach (var diagnostic in e.Diagnostics)
                {
                    ScriptConsole.WritePrettyError(diagnostic.ToString());
                }

                throw;
            }
        }
Esempio n. 6
0
        private async Task RunFirstScript(ScriptContext scriptContext)
        {
            foreach (var arg in scriptContext.Args)
            {
                _globals.Args.Add(arg);
            }

            var compilationContext = ScriptCompiler.CreateCompilationContext <object, InteractiveScriptGlobals>(scriptContext);

            Console.WriteDiagnostics(compilationContext.Warnings, compilationContext.Errors);

            if (compilationContext.Errors.Any())
            {
                throw new CompilationErrorException("Script compilation failed due to one or more errors.", compilationContext.Errors.ToImmutableArray());
            }

            _scriptState = await compilationContext.Script.RunAsync(_globals, ex => true).ConfigureAwait(false);

            _scriptOptions = compilationContext.ScriptOptions;
        }
Esempio n. 7
0
        public virtual ScriptEmitResult Emit <TReturn, THost>(ScriptContext context, string assemblyName)
        {
            var compilationContext = _scriptCompiler.CreateCompilationContext <TReturn, THost>(context);

            foreach (var warning in compilationContext.Warnings)
            {
                _scriptConsole.WriteHighlighted(warning.ToString());
            }

            if (compilationContext.Errors.Any())
            {
                foreach (var diagnostic in compilationContext.Errors)
                {
                    _scriptConsole.WriteError(diagnostic.ToString());
                }

                throw new CompilationErrorException("Script compilation failed due to one or more errors.", compilationContext.Errors.ToImmutableArray());
            }

            var compilation = compilationContext.Script.GetCompilation();

            compilation = compilation.WithAssemblyName(assemblyName);

            var         peStream    = new MemoryStream();
            EmitOptions emitOptions = null;

            if (context.OptimizationLevel == Microsoft.CodeAnalysis.OptimizationLevel.Debug)
            {
                emitOptions = new EmitOptions()
                              .WithDebugInformationFormat(DebugInformationFormat.Embedded);
            }

            var result = compilation.Emit(peStream, options: emitOptions);

            if (result.Success)
            {
                return(new ScriptEmitResult(peStream, compilation.DirectiveReferences, compilationContext.RuntimeDependencies));
            }

            return(ScriptEmitResult.Error(result.Diagnostics));
        }
        public virtual ScriptEmitResult Emit <TReturn>(ScriptContext context, string assemblyName = null)
        {
            try
            {
                var compilationContext = _scriptCompiler.CreateCompilationContext <TReturn, CommandLineScriptGlobals>(context);

                var compilation = compilationContext.Script.GetCompilation();
                if (!string.IsNullOrEmpty(assemblyName))
                {
                    var compilationOptions = compilationContext.Script.GetCompilation().Options
                                             .WithScriptClassName(assemblyName);
                    compilation = compilationContext.Script.GetCompilation()
                                  .WithOptions(compilationOptions)
                                  .WithAssemblyName(assemblyName);
                }

                var peStream  = new MemoryStream();
                var pdbStream = new MemoryStream();
                var result    = compilation.Emit(peStream, pdbStream: pdbStream, options: new EmitOptions().
                                                 WithDebugInformationFormat(DebugInformationFormat.PortablePdb));

                if (result.Success)
                {
                    return(new ScriptEmitResult(peStream, pdbStream, compilation.DirectiveReferences));
                }

                return(ScriptEmitResult.Error(result.Diagnostics));
            }
            catch (CompilationErrorException e)
            {
                foreach (var diagnostic in e.Diagnostics)
                {
                    _scriptConsole.WritePrettyError(diagnostic.ToString());
                }

                throw;
            }
        }
Esempio n. 9
0
        public virtual Task <TReturn> Execute <TReturn, THost>(ScriptContext context, THost host)
        {
            var compilationContext = ScriptCompiler.CreateCompilationContext <TReturn, THost>(context);

            return(Execute(compilationContext, host));
        }
        public override Task <TReturn> Execute <TReturn, THost>(ScriptContext context, THost host)
        {
            Logger.Log("Using debug mode.");
            Logger.Log($"Using configuration: {context.Configuration}");

            var compilationContext = ScriptCompiler.CreateCompilationContext <TReturn, THost>(context);

            var compilation = compilationContext.Script.GetCompilation();

            foreach (var diagnostic in compilation.GetDiagnostics().Where(d => d.Severity == DiagnosticSeverity.Warning))
            {
                Logger.Log(diagnostic.ToString());
            }

            foreach (var syntaxTree in compilation.SyntaxTrees)
            {
                // https://github.com/dotnet/roslyn/blob/version-2.0.0-beta4/src/Compilers/CSharp/Portable/Syntax/CSharpSyntaxTree.ParsedSyntaxTree.cs#L19
                var encodingField = syntaxTree.GetType().GetField("_encodingOpt", BindingFlags.Instance | BindingFlags.NonPublic);
                encodingField.SetValue(syntaxTree, Encoding.UTF8);

                // https://github.com/dotnet/roslyn/blob/version-2.0.0-beta4/src/Compilers/CSharp/Portable/Syntax/CSharpSyntaxTree.ParsedSyntaxTree.cs#L21
                var lazyTextField = syntaxTree.GetType().GetField("_lazyText", BindingFlags.Instance | BindingFlags.NonPublic);
                lazyTextField.SetValue(syntaxTree, compilationContext.SourceText);
            }

            using (var peStream = new MemoryStream())
                using (var pdbStream = new MemoryStream())
                {
                    var emitOptions = new EmitOptions().WithDebugInformationFormat(DebugInformationFormat.PortablePdb);
                    var emitResult  = compilation.Emit(peStream, pdbStream, null, null, null, emitOptions);

                    if (emitResult.Success)
                    {
                        // https://github.com/dotnet/roslyn/blob/version-2.0.0-beta4/src/Compilers/Core/Portable/Compilation/Compilation.cs#L478
                        var referenceManager = compilation.Invoke <object>("GetBoundReferenceManager", BindingFlags.NonPublic);

                        var referencedAssemblies =
                            // https://github.com/dotnet/roslyn/blob/version-2.0.0-beta4/src/Compilers/Core/Portable/ReferenceManager/CommonReferenceManager.State.cs#L34
                            referenceManager.Invoke <IEnumerable <KeyValuePair <MetadataReference, IAssemblySymbol> > >("GetReferencedAssemblies", BindingFlags.NonPublic);

                        foreach (var referencedAssembly in referencedAssemblies)
                        {
                            var path = (referencedAssembly.Key as PortableExecutableReference)?.FilePath;
                            if (path != null)
                            {
                                compilationContext.Loader.RegisterDependency(referencedAssembly.Value.Identity, path);
                            }
                        }

                        peStream.Position  = 0;
                        pdbStream.Position = 0;

                        var assembly =
                            // https://github.com/dotnet/roslyn/blob/version-2.0.0-beta4/src/Scripting/Core/Hosting/AssemblyLoader/InteractiveAssemblyLoader.cs#L111
                            compilationContext.Loader.Invoke <Stream, Stream, Assembly>(
                                "LoadAssemblyFromStream", BindingFlags.NonPublic,
                                peStream, pdbStream);

                        var entryPoint     = compilation.GetEntryPoint(default(CancellationToken));
                        var entryPointType = assembly.GetType(entryPoint.ContainingType.MetadataName, true, false).GetTypeInfo();
                        var resultTask     =
                            entryPointType.
                            GetDeclaredMethod(entryPoint.MetadataName).
                            Invoke <object[], Task <TReturn> >(
                                (object)null, // static invocation
                                new object[] { host, null });

                        return(resultTask);
                    }
                }

            return(Task.FromResult(default(TReturn)));
        }