在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);

在c#中是否可以在运行时创建/执行代码?

绝对的——这正是我为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