【发布时间】:2015-11-12 19:22:45
【问题描述】:
我一直在使用 DynamiMethod 来生成 IL
method.GetILGenerator();
这很好用,但当然很难使用,因为您通常不希望在 C# 等高级语言中使用低级 IL。现在既然有罗斯林,我虽然可以用它来代替。我试图弄清楚如何使用 Roslyn 来做类似的事情:生成一个动态方法,然后为它创建一个委托。我能够做到这一点的唯一方法就是参加这样的完整课程
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@"
using System;
namespace RoslynCompileSample
{
public class Writer
{
public void Write(string message)
{
Console.WriteLine(message);
}
}
}");
然后,我可以使用字符串连接将我的方法插入其中,而不是 Write 方法。在内存中生成动态程序集并加载后,使用反射获取所需的方法并生成委托。
这种方法似乎工作正常,但对我的情况来说似乎有点过头了,因为我需要使用多种独立的方法,这可能会导致加载大量程序集。
所以问题是:是否有一种简单的方法可以为 Roslyn 执行类似于动态方法的操作,以便我只能定义附加到类型的方法体?如果没有,编译许多动态程序集是否有什么大的缺点(比如太多无法加载等...)
【问题讨论】:
-
Roslyn 曾经有一个
DynamicMethod发射器,但是DynamicMethod限制太多,所以被移除了。 -
很遗憾,因为这应该提供不错的功能,而不会弄乱程序集加载...
标签: c# .net compilation roslyn reflection.emit