我希望将由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());