I'm trying to create an in memory assembly using the CSharpCompilation.Emit method but for some odd reason it's always throwing an exception saying that it can't load System.Security.Cryptography.Algorithms. The project it runs in is .netstandard, but the startup project is .net framework, not sure if that matters.
Here is the code:
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
var netstandardAssembly =
assemblies.First(x => !x.IsDynamic && x.Location.Contains("netstandard"));
MetadataReference[] references = {
MetadataReference.CreateFromFile(netstandardAssembly.Location),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Core.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "Microsoft.CSharp.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "mscorlib.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Data.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll")),
MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location)
};
CSharpCompilation compilation =
CSharpCompilation.Create(name)
.WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
.WithReferences(references)
.AddSyntaxTrees(CSharpSyntaxTree.ParseText(@"namespace Example.Main
{
public class Class1
{
}
}"));
try
{
byte[] assemblyBytes;
using (MemoryStream ms = new MemoryStream())
{
var result = compilation.Emit(ms);
if (!result.Success)
{
IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
diagnostic.IsWarningAsError ||
diagnostic.Severity == DiagnosticSeverity.Error);
foreach (Diagnostic diagnostic in failures)
{
_logger.LogDebug($"{diagnostic.Id}: {diagnostic.GetMessage()}");
}
}
ms.Seek(0, SeekOrigin.Begin);
assemblyBytes = ms.ToArray();
}
return assemblyBytes;
}
catch (Exception ex)
{
_logger.LogError(ex, "Could not compile");
return null;
}
Here is the stack trace:
at Microsoft.CodeAnalysis.Emit.EmitOptions.ValidateOptions(DiagnosticBag diagnostics, CommonMessageProvider messageProvider, Boolean isDeterministic)
at Microsoft.CodeAnalysis.Compilation.CheckOptionsAndCreateModuleBuilder(DiagnosticBag diagnostics, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, CancellationToken cancellationToken)```