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; }
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)); }
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; } }
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; }
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; } }
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))); }