【问题标题】:Is it possible to create/execute code in run-time in C#?是否可以在 C# 的运行时创建/执行代码?
【发布时间】:2011-08-08 18:40:45
【问题描述】:

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

【问题讨论】:

  • 定义“实时”。 .NET 不是一个实时平台,因为您无法控制线程何时会因其他任务(包括垃圾收集)而被中断。
  • 是的 - 见here
  • @Eric J:对不起,我可能误用了“实时”这个词。我的意思是 C# 代码应该在应用程序运行时动态生成,而不是在编译之前静态实现。 (例如,应该执行的 c# 代码是从文本流中动态读取的)

标签: c# .net runtime


【解决方案1】:

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

我相信他们使用CSharpCodeProvider

【讨论】:

    【解决方案2】:

    是的。见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】:

      绝对 - 这正是我为 Snippy 所做的,例如,对于 C# in Depth。你可以在这里下载source code - 它使用CSharpCodeProvider

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

      【讨论】:

        【解决方案4】:

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

        这里是 msdn 参考的快速链接,内容非常丰富。

        MSDN: Using the CodeDom

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 1970-01-01
          • 2012-06-16
          • 1970-01-01
          相关资源
          最近更新 更多