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

时间:2011-04-19 15:05:06

标签: c# .net runtime

我知道你可以dynamically create a .NET assembly using Emit, System.Reflection and manually created IL code as shown here

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

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

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

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

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

4 个答案:

答案 0 :(得分:8)

绝对 - 这正是我为Snippy所做的,例如,对于深度的C#。您可以在此处下载source code - 它使用CSharpCodeProvider

还可以构建表达式树,然后使用DynamicMethod或.NET 4中的DLR将它们编译为委托......各种各样的事情。

答案 1 :(得分:1)

是的,确实如此。有几个应用程序可以做到这一点 - 请参阅LinqPadSnippy

我相信他们使用CSharpCodeProvider

答案 2 :(得分:0)

是。请参阅this MSDN page regarding using the CodeDOM

从上面提到的页面中提取的一些示例代码:

CodeEntryPointMethod start = new CodeEntryPointMethod();
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression( 
    new CodeTypeReferenceExpression("System.Console"), 
    "WriteLine", new CodePrimitiveExpression("Hello World!") );
start.Statements.Add(cs1); 

答案 3 :(得分:0)

您可以使用CodeDom生成代码并根据生成的代码在内存程序集中创建。然后可以在当前的应用程序中使用它。

这是msdn参考的快速链接,它是非常广泛的材料。

MSDN: Using the CodeDom