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

时间:2017-03-26 18:28:25

标签: c# asp.net .net .net-assembly roslyn

我想将一个roslyn生成的程序集放入一个字节数组(工作),然后将它从这些字节加载到另一个程序集中。它在net framework 4.6中工作但在.NET CORE中似乎失败

HEre是代码。

 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核心中,由于某种原因,我没有Assembly.Load(bytes [] buffer)重载。任何人都可以帮助我吗?谢谢。

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

1 个答案:

答案 0 :(得分:1)

您可以使用AssemblyLoadContext

从.NET核心中的流加载程序集
// requires "System.Runtime.Loader": "4.0.0",
public Assembly LoadAssembly(MemoryStream peStream, MemoryStream pdbStream)
{
    return System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromStream(peStream, pdbStream);
}