public byte[] Compile(string code) { var syntaxTree = CSharpSyntaxTree.ParseText(code); var references = GetTrustedReferences().Concat(ReferencedTypes.Select(GetReference)); var compileOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithConcurrentBuild(true) .WithOptimizationLevel(OptimizationLevel.Release) .WithWarningLevel(0); var compilation = CSharpCompilation.Create($"{Guid.NewGuid():N}", syntaxTree.Yield(), references, compileOptions); using var ms = new MemoryStream(); var result = compilation.Emit(ms); if (!result.Success) { throw new CompilationErrorException("Code failed to compile", result.Diagnostics.Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error).ToImmutableArray()); } ms.Position = 0; return(ms.ToArray()); }
public IEnumerable <string> GetReferencedTypes() { return(ReferencedTypes.Select(x => x.FullName).OrderBy(x => x)); }