Использование .NET Core 2.1 и Microsoft.CodeAnalysis.CSharp.Scripting 2.10.0 до динамически компилировать в сборку и сохранять ее впамять .Затем пытается загрузить эту сборку через AssemblyLoadContext
, получая
Плохой формат IL
Как правильно загрузить полностью в памяти сборку?В чем причина этого исключения?Мне не хватает указать метаданные для сборки в памяти?В каких других наиболее распространенных случаях может возникнуть Плохой формат IL ?
В приведенном ниже примере кода выдается исключение:
using System.IO;
using System.Reflection;
using System.Runtime.Loader;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace ConsoleApp2
{
class Program
{
static async Task Main(string[] args)
{
using (Stream stream = new MemoryStream())
{
var compilation = CSharpCompilation.Create("a")
.WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
.AddReferences(
MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location))
.AddSyntaxTrees(CSharpSyntaxTree.ParseText(
@"
public static class C
{
public static int M(int a, int b)
{
return a+b;
}
}
"));
var results = compilation.Emit(stream);
//results.Success is true here
var context = AssemblyLoadContext.Default;
Assembly a = context.LoadFromStream(stream);//<--Exception here.
}
}
}
}
Подробности исключения во время выполнения:
System.BadImageFormatException
HResult=0x8007000B
Message=Bad IL format.
Source=<Cannot evaluate the exception source>
StackTrace:
at System.Runtime.Loader.AssemblyLoadContext.LoadFromStream(IntPtr ptrNativeAssemblyLoadContext, IntPtr ptrAssemblyArray, Int32 iAssemblyArrayLen, IntPtr ptrSymbols, Int32 iSymbolArrayLen, ObjectHandleOnStack retAssembly)
at System.Runtime.Loader.AssemblyLoadContext.LoadFromStream(Stream assembly, Stream assemblySymbols)
at ConsoleApp2.Program.<Main>d__0.MoveNext() in C:\repos\sketches\ConsoleApp2\Program.cs:line 37
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at ConsoleApp2.Program.<Main>(String[] args)