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());
        }
Example #2
0
 public IEnumerable <string> GetReferencedTypes()
 {
     return(ReferencedTypes.Select(x => x.FullName).OrderBy(x => x));
 }