private static CompilationResult CompileInternal(string originalName, string cSharpSafeName, MemberDeclarationSyntax @class, IndexDefinition definition) { var name = cSharpSafeName + "." + Guid.NewGuid() + IndexExtension; var @namespace = RoslynHelper.CreateNamespace(IndexNamespace) .WithMembers(SyntaxFactory.SingletonList(@class)); var res = GetUsingDirectiveAndSyntaxTreesAndReferences(definition); var compilationUnit = SyntaxFactory.CompilationUnit() .WithUsings(RoslynHelper.CreateUsings(res.UsingDirectiveSyntaxes)) .WithMembers(SyntaxFactory.SingletonList <MemberDeclarationSyntax>(@namespace)) .NormalizeWhitespace(); SyntaxNode formattedCompilationUnit; using (var workspace = new AdhocWorkspace()) { formattedCompilationUnit = Formatter.Format(compilationUnit, workspace); } string sourceFile = null; if (EnableDebugging) { sourceFile = Path.Combine(Path.GetTempPath(), name + ".cs"); File.WriteAllText(sourceFile, formattedCompilationUnit.ToFullString(), Encoding.UTF8); } var st = EnableDebugging ? SyntaxFactory.ParseSyntaxTree(File.ReadAllText(sourceFile), path: sourceFile, encoding: Encoding.UTF8) : SyntaxFactory.ParseSyntaxTree(formattedCompilationUnit.ToFullString()); res.SyntaxTrees.Add(st); var compilation = CSharpCompilation.Create( assemblyName: name, syntaxTrees: res.SyntaxTrees, references: res.References, options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithOptimizationLevel(EnableDebugging ? OptimizationLevel.Debug : OptimizationLevel.Release) ); var code = formattedCompilationUnit.SyntaxTree.ToString(); var asm = new MemoryStream(); var pdb = EnableDebugging ? new MemoryStream() : null; var result = compilation.Emit(asm, pdb, options: new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb)); if (result.Success == false) { IEnumerable <Diagnostic> failures = result.Diagnostics .Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error); var sb = new StringBuilder(); sb.AppendLine($"Failed to compile index {originalName}"); sb.AppendLine(); sb.AppendLine(code); sb.AppendLine(); foreach (var diagnostic in failures) { sb.AppendLine(diagnostic.ToString()); } throw new IndexCompilationException(sb.ToString()); } asm.Position = 0; Assembly assembly; if (EnableDebugging) { pdb.Position = 0; assembly = AssemblyLoadContext.Default.LoadFromStream(asm, pdb); } else { assembly = AssemblyLoadContext.Default.LoadFromStream(asm); } return(new CompilationResult { Code = code, Type = assembly.GetType($"{IndexNamespace}.{cSharpSafeName}") }); }