我有一个C#应用程序,它在运行时生成.NET函数并执行它们。 为此,它在字符串中生成C#并调用在线C#编译器将其转换为CLR以进行JIT编译和执行。
出于性能原因,我希望能够直接生成CLR(在字符串中或通过内部表示)并在不使用任何编译器(但可能是JIT编译器)的情况下执行它。
这可能吗?我已经看过一些关于代码注入的文章,但这并不符合这个要求。
谢谢!
答案 0 :(得分:4)
我怀疑System.Reflection.Emit
就是你所追求的。特别是,如果您只想生成一个方法,我相信您应该查看DynamicMethod。您可以向create an ILGenerator询问它,构建IL,然后在将方法转换为委托时进行JIT编译。
我不相信你可以只给它文本IL ...你将使用API,明确地构建各种指令。虽然可能有一个IL解析器使用它...
答案 1 :(得分:2)
如果您只想创建.Net功能,Expression trees是可行的方法。如果你想创建一个完整的类,你可以使用Reflection.Emit,但是你正在编写汇编代码。
如果您等待.Net 5,也许他们会有一个可以传递任意C#代码的编译器版本,但是现在也许您可以使用使用DLR的东西(如IronPython)来传递实际的源代码到。
答案 2 :(得分:0)
我可能不理解这个问题,但你不能从你的应用程序生成C#代码,而不是生成C#编译器会生成的等效中间语言(IL)代码吗?然后你可以直接运行IL代码而无需先编译它。