ASP.NET CORE中从字节加载程序集

4

我希望将由Roslyn生成的程序集放入字节数组中(已成功),然后从这些字节中加载到另一个程序集中。在 .NET Framework 4.6 中可以正常工作,但似乎在 .NET CORE 中失败了。

以下是代码:

 public class Pr2
{
    public static void Main()
    {
        var code = File.ReadAllText(@"E:\VictoriaCMS\WebApplication4\WebApplication4\Controllers\code.cs");
        var tree = SyntaxFactory.ParseSyntaxTree(code);

        var compilation = CreateCompilation(tree);
        var model = compilation.GetSemanticModel(tree);

         ShowLocalDeclarations(tree, model);
         ShowDiagnostics(compilation);
         ExecuteCode(compilation);

    }

    private static void ShowLocalDeclarations(SyntaxTree tree, SemanticModel model)
    {
        var locals = tree.GetRoot()
                         .DescendantNodes()
                         .OfType<LocalDeclarationStatementSyntax>();

        foreach (var node in locals)
        {
            var type = model.GetTypeInfo(node.Declaration.Type);
            Console.WriteLine("{0} {1}", type.Type, node.Declaration);
        }
    }

    private static void ExecuteCode(CSharpCompilation compilation)
    {
        using (var stream = new MemoryStream())
        {
            compilation.Emit(stream);

            var assembly = Assembly.Load(stream.GetBuffer()); 

            var type = assembly.GetType("Greeter");
            var greeter = Activator.CreateInstance(type);
            var method = type.GetMethod("SayHello");
            method.Invoke(greeter, null);
        }
    }

    private static void ShowDiagnostics(CSharpCompilation compilation)
    {
        var diagnostics = compilation.GetDiagnostics();
        foreach (var diagnostic in diagnostics)
        {
            Console.WriteLine(diagnostic.ToString());
        }
    }

    private static CSharpCompilation CreateCompilation(SyntaxTree tree)
    {
        var options = new CSharpCompilationOptions(
                                        OutputKind.DynamicallyLinkedLibrary);

        var reference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);

        var compilation =
            CSharpCompilation.Create("test")
                             .WithOptions(options)
                             .AddSyntaxTrees(tree)
                             .AddReferences(reference);
        return compilation;
    }
}

在 .Net Core 中,由于某些原因,我没有找到 Assembly.Load (bytes[] buffer) 重载方法。有人能帮我吗?谢谢。
  var assembly = Assembly.Load(stream.GetBuffer()); 
1个回答

1

您可以使用 AssemblyLoadContext 从流中加载.NET Core程序集:

// requires "System.Runtime.Loader": "4.0.0",
public Assembly LoadAssembly(MemoryStream peStream, MemoryStream pdbStream)
{
    return System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromStream(peStream, pdbStream);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接