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

我知道您可以使用Emit,System.Reflection和手动创建的IL代码动态创建.NET程序集,如下所示 。

但我想知道是否有可能在正在运行的应用程序中实时动态创建和执行C#代码块。 感谢您的任何意见或想法。

编辑:据我所知,CodeDOM允许您将C#代码编译为EXE文件而不是“只是”执行它。 这里有一些背景信息以及为什么(据我所知)这对我来说不是最好的选择。 我正在创建一个必须执行这么多动态创建的代码的应用程序[用于记录 – 它用于学术研究,而不是真实世界的应用程序,因此无法避免]。 因此,创建/执行数千个动态创建的EXE并不是非常有效。 其次 – 所有动态代码片段都会返回一些难以从单独运行的EXE中读取的数据。 如果我遗失了什么,请告诉我。

至于Jon Skeet指出的DynamicMethod方法,如果有更简单的方法来编写代码本身而不是低级IL代码,那么一切都会像魅力一样。

换句话说 (非常严厉地说)我需要这样的东西:

string x = "_some c# code here_"; var result = Exec(x); 

绝对 – 这正是我为Snippy所做的,例如,对于深度的C#。 您可以在此处下载源代码 – 它使用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:使用CodeDom