c# - Roslyn 能否用于生成类似于 DynamicMethod IL 生成的动态方法

标签 c# .net compilation roslyn reflection.emit

我一直在使用 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/

相关文章:

c# - 如何使 .NET 类库可链接(无 DLL)

c# - 编程中声明式范例和命令式范例有什么区别?

c# - 查询 "Memory"的 LINQ

docker - 在Docker环境中使用命令行应用程序的最佳方法是什么?

.net - 如何修改 MySQL Connector 的源代码并将其安装到我的 PC 上?

c++ - OpenCV C++ 与 extern "C"

c# - Advantage 数据库错误 5175

C# 字符串替换

c# - 新建具有非常大初始容量的 List<T> 并填充它与简单地填充 LinkedList<T> 的性能

java - 如何提供跨平台、异步的服务接口(interface)