在c#中是否可以在运行时创建/执行代码?
本文关键字:执行 代码 创建 是否 运行时 | 更新日期: 2023-09-27 17:50:29
我知道您可以使用Emit, System动态创建。net程序集。反射和手动创建IL代码,如下所示。
但我想知道是否有可能动态创建和执行c#代码块实时,在运行的应用程序。谢谢你的意见和建议。
编辑:据我所知,CodeDOM允许您将c#代码编译成EXE文件,而不是"只是"执行它。这里有一些背景信息,以及为什么(据我所知)这对我来说不是最好的选择。我正在创建一个应用程序,它将不得不执行这样一个动态创建的代码相当多[记录-这是学术研究,而不是现实世界的应用程序,因此这是不可避免的]。因此,创建/执行数千个动态创建的exe并不是真正有效的。其次,所有动态代码片段都会返回一些很难从单独运行的EXE中读取的数据。如果我错过了什么,请告诉我。
至于由Jon Skeet指出的DynamicMethod方法,如果有一种更简单的方法来编写代码本身,而不是低级的IL代码,那么一切都会像魅力一样工作。
换句话说(非常严厉地说)我需要这样的东西:
string x = "_some c# code here_";
var result = Exec(x);
绝对的——这正是我为Snippy所做的,例如c# in Depth。您可以在这里下载源代码-它使用CSharpCodeProvider
。
也有可能构建表达式树,然后将它们编译成委托,使用DynamicMethod
或。net 4中的DLR…各种各样的东西
是的。有几个应用程序可以做到这一点-参见LinqPad和Snippy。
我相信他们用的是CSharpCodeProvider
。
是。关于使用CodeDOM,请参阅此MSDN页面。
从上面提到的页面中提取的一些示例代码:
CodeEntryPointMethod start = new CodeEntryPointMethod();
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression("System.Console"),
"WriteLine", new CodePrimitiveExpression("Hello World!") );
start.Statements.Add(cs1);
您可以使用CodeDom生成代码并基于生成的代码在内存中创建程序集。这些可以在当前应用程序中使用。
这是一个快速链接到msdn参考,它是相当广泛的材料。
MSDN: Using CodeDom