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

4
我知道你可以使用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);

1
定义“实时”。.NET不是实时平台,因为您无法控制线程何时会被中断以执行其他任务,包括垃圾回收。 - Eric J.
是的 - 请参见这里 - BrandonZeider
可能是是否可以动态编译和执行C#代码片段?的重复问题。 - BrokenGlass
@Eric J:抱歉,我可能误用了“实时”这个术语。我的意思是在应用程序运行时动态生成C#代码,而不是在编译之前静态实现它。(例如,应该执行的C#代码是从文本流中动态读取的) - rexem
4个回答

8

当然可以 - 这正是我为 Snippy 和 C# in Depth 所做的事情。您可以在此处下载 源代码,它使用CSharpCodeProvider

还有一种可能性,就是构建表达式树,然后使用DynamicMethod或 .NET 4 中的 DLR 将其编译成委托...各种各样的东西。


1

0

是的。请参阅此MSDN页面关于使用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: 使用CodeDom


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接