public Assembly Load(IAssemblyLoaderEngine loaderEngine) { using (var pdbStream = new MemoryStream()) using (var assemblyStream = new MemoryStream()) { IList <ResourceDescription> resources = GetResources(); Trace.TraceInformation("[{0}]: Emitting assembly for {1}", GetType().Name, Name); var sw = Stopwatch.StartNew(); EmitResult emitResult = null; if (PlatformHelper.IsMono) { // Pdbs aren't supported on mono emitResult = CompilationContext.Compilation.Emit(assemblyStream, manifestResources: resources); } else { emitResult = CompilationContext.Compilation.Emit(assemblyStream, pdbStream: pdbStream, manifestResources: resources); } sw.Stop(); Trace.TraceInformation("[{0}]: Emitted {1} in {2}ms", GetType().Name, Name, sw.ElapsedMilliseconds); var diagnostics = CompilationContext.Diagnostics.Concat( emitResult.Diagnostics); var result = CreateDiagnosticResult(emitResult.Success, diagnostics); if (!result.Success) { throw new CompilationException(result.Errors.ToList()); } Assembly assembly = null; // Rewind the stream assemblyStream.Seek(0, SeekOrigin.Begin); pdbStream.Seek(0, SeekOrigin.Begin); if (pdbStream.Length == 0) { assembly = loaderEngine.LoadStream(assemblyStream, pdbStream: null); } else { assembly = loaderEngine.LoadStream(assemblyStream, pdbStream); } return(assembly); } }
public static CompilationResult GetAssemblyFromCompilation( IAssemblyLoaderEngine loader, Compilation compilation) { EmitResult result; using (var ms = new MemoryStream()) { using (var pdb = new MemoryStream()) { if (PlatformHelper.IsMono) { result = compilation.Emit(ms, pdbStream: null); } else { result = compilation.Emit(ms, pdbStream: pdb); } if (!result.Success) { var formatter = new DiagnosticFormatter(); var errorMessages = result.Diagnostics .Where(IsError) .Select(d => formatter.Format(d)); return(CompilationResult.FromErrorMessages(errorMessages)); } ms.Seek(0, SeekOrigin.Begin); Assembly assembly; if (PlatformHelper.IsMono) { assembly = loader.LoadStream(ms, pdbStream: null); } else { pdb.Seek(0, SeekOrigin.Begin); assembly = loader.LoadStream(ms, pdb); } return(CompilationResult.FromAssembly(assembly)); } } }
/// <inheritdoc /> public CompilationResult Compile(IFileInfo fileInfo, string compilationContent) { var sourceText = SourceText.From(compilationContent, Encoding.UTF8); var syntaxTrees = new[] { CSharpSyntaxTree.ParseText(sourceText, path: fileInfo.PhysicalPath) }; var references = _applicationReferences.Value; var assemblyName = Path.GetRandomFileName(); var compilation = CSharpCompilation.Create(assemblyName, options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary), syntaxTrees: syntaxTrees, references: references); using (var ms = new MemoryStream()) { using (var pdb = new MemoryStream()) { EmitResult result; if (PlatformHelper.IsMono) { result = compilation.Emit(ms, pdbStream: null); } else { result = compilation.Emit(ms, pdbStream: pdb); } if (!result.Success) { var formatter = new DiagnosticFormatter(); var messages = result.Diagnostics .Where(IsError) .Select(d => GetCompilationMessage(formatter, d)) .ToList(); return(CompilationResult.Failed(fileInfo, compilationContent, messages)); } Assembly assembly; ms.Seek(0, SeekOrigin.Begin); if (PlatformHelper.IsMono) { assembly = _loader.LoadStream(ms, pdbStream: null); } else { pdb.Seek(0, SeekOrigin.Begin); assembly = _loader.LoadStream(ms, pdb); } var type = assembly.GetExportedTypes() .First(); return(UncachedCompilationResult.Successful(type, compilationContent)); } } }
public Assembly Load(IAssemblyLoaderEngine loaderEngine) { using (var pdbStream = new MemoryStream()) using (var assemblyStream = new MemoryStream()) { IList<ResourceDescription> resources = GetResources(); Trace.TraceInformation("[{0}]: Emitting assembly for {1}", GetType().Name, Name); var sw = Stopwatch.StartNew(); EmitResult emitResult = null; if (PlatformHelper.IsMono) { // Pdbs aren't supported on mono emitResult = CompilationContext.Compilation.Emit(assemblyStream, manifestResources: resources); } else { emitResult = CompilationContext.Compilation.Emit(assemblyStream, pdbStream: pdbStream, manifestResources: resources); } sw.Stop(); Trace.TraceInformation("[{0}]: Emitted {1} in {2}ms", GetType().Name, Name, sw.ElapsedMilliseconds); var diagnostics = CompilationContext.Diagnostics.Concat( emitResult.Diagnostics); var result = CreateDiagnosticResult(emitResult.Success, diagnostics); if (!result.Success) { throw new CompilationException(result.Errors.ToList()); } Assembly assembly = null; // Rewind the stream assemblyStream.Seek(0, SeekOrigin.Begin); pdbStream.Seek(0, SeekOrigin.Begin); if (pdbStream.Length == 0) { assembly = loaderEngine.LoadStream(assemblyStream, pdbStream: null); } else { assembly = loaderEngine.LoadStream(assemblyStream, pdbStream); } return assembly; } }
public CompilationResult Compile(string content) { var syntaxTrees = new[] { CSharpSyntaxTree.ParseText(content) }; var targetFramework = _environment.TargetFramework; var references = GetApplicationReferences(); var assemblyName = Path.GetRandomFileName(); var compilation = CSharpCompilation.Create(assemblyName, options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary), syntaxTrees: syntaxTrees, references: references); using (var ms = new MemoryStream()) { using (var pdb = new MemoryStream()) { EmitResult result; if (PlatformHelper.IsMono) { result = compilation.Emit(ms, pdbStream: null); } else { result = compilation.Emit(ms, pdbStream: pdb); } if (!result.Success) { var formatter = new DiagnosticFormatter(); var messages = result.Diagnostics .Where(IsError) .Select(d => GetCompilationMessage(formatter, d)) .ToList(); return(CompilationResult.Failed(content, messages)); } Assembly assembly; ms.Seek(0, SeekOrigin.Begin); if (PlatformHelper.IsMono) { assembly = _loader.LoadStream(ms, pdbStream: null); } else { pdb.Seek(0, SeekOrigin.Begin); assembly = _loader.LoadStream(ms, pdb); } var type = assembly.GetExportedTypes() .First(); return(CompilationResult.Successful(string.Empty, type)); } } }