示例#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 static ScriptEmitResult Error(IEnumerable <Diagnostic> diagnostics)
        {
            var result = new ScriptEmitResult
            {
                Diagnostics = diagnostics.ToImmutableArray()
            };

            return(result);
        }
        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;
            }
        }