我一直在使用 DynamiMethod 生成 IL
method.GetILGenerator();
这很好用,但当然很难使用,因为您通常不想在像 C# 这样的高级语言中使用低级 IL。现在因为有了 Roslyn,我可以改用它。我试图弄清楚如何使用 Roslyn 来做类似的事情:生成一个动态方法,然后为它创建一个委托(delegate)。我能够做到这一点的唯一方法就是像这样上全类
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@"
using System;
namespace RoslynCompileSample
{
public class Writer
{
public void Write(string message)
{
Console.WriteLine(message);
}
}
}");
然后我可以使用字符串连接在内部插入我的方法,而不是 Write 方法。在内存中生成并加载动态程序集之后,使用反射获取所需的方法并生成委托(delegate)。
这种方法似乎工作正常,但对我的情况来说似乎有点矫枉过正,因为我将需要使用多个独立的方法,可能会导致加载大量程序集。
所以问题是:是否有一种简单的方法可以为 Roslyn 执行类似于动态方法的操作,以便我只能定义附加到类型的方法的主体?如果不是,编译很多动态程序集有什么大的缺点吗(比如太多无法加载等......)
最佳答案
您可以使用CSharpScript
类。 await CSharpScript.EvaluateAsync("1 + 2")
只是计算表达式。您可以在 Microsoft.CodeAnalysis.Scripting.CSharp
包中找到它(目前只有预发布版本)。使用 ScriptOptions(第二个参数)添加 usings 和程序集引用。
编译表达式委托(delegate):
var func = CSharpScript.Create<int>("1 + 3").CompileToDelegate()
使用全局对象将一些东西传递给函数:
await CSharpScript.Create<int>("1 + x",
ScriptOptions.Default.AddReferences(typeof(Program).Assembly),
globalsType: typeof(ScriptGlobals))
.CreateDelegate()
.Invoke(new ScriptGlobals() { x = 4 });
关于c# - Roslyn 能否用于生成类似于 DynamicMethod IL 生成的动态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32096423/