2011-04-19 270 views
4

我知道你可以dynamically create a .NET assembly using Emit, System.Reflection and manually created IL code as shown here是否可以在C#中运行时创建/执行代码?

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

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

至于DynamicMethod的方法,指出了乔恩斯基特,一切都将工作就像一个魅力是否会有写的代码本身,而不是低水平的IL代码更简单的方法。

换句话说(很严厉地说)我需要的是这样的:

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

定义“实时”。 .NET不是一个实时平台,因为您无法控制线程何时会被其他任务(包括垃圾收集)中断。 – 2011-04-19 15:09:15

+0

[是否可以动态编译和执行C#代码片段?](http://stackoverflow.com/questions/826398/is-it-possible-to-dynamically-compile-and-execute-c-code -fragments) – BrokenGlass 2011-04-19 15:11:02

+0

@Eric J:对不起,我可能误用了“实时”这个词。我的意思是应该在应用程序运行时动态生成C#代码,并且在编译之前不要静态实现。 (例如,应该执行的c#代码是从文本流中动态读取的) – rexem 2011-04-19 15:53:56

回答

8

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

还可以构建表达式树,然后将它们编译成代表,使用DynamicMethod或.NET 4中的DLR ......各种各样的东西。

+0

乔恩,http://csharpindepth.com/Downloads.aspx给页面找不到。谢谢 – user219628 2013-06-22 01:20:28

+1

@ user219628:奇怪 - 它在为我工作... – 2013-06-22 07:40:30

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

您可以使用CodeDom生成代码并根据生成的代码在内存组件中创建代码。这些可以在当前的应用中使用。

下面是一个msdn参考的快速链接,它是相当广泛的材料。

MSDN: Using the CodeDom

相关问题