Загрузка сборки C # из MemoryStream: плохой формат IL.Как правильно загрузить полностью встроенную память? - PullRequest
0 голосов
/ 11 декабря 2018

Использование .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)
...