使用Reflection.Emit从字符串生成动态代码

时间:2012-11-21 15:52:03

标签: c# reflection reflection.emit dynamic-code

我在数据库表中存储了一些C#代码。

我在字符串中有基类的完整代码。

使用存储的C#代码,我在类中添加了一个名为m1的方法,其中包含return <<some C# code>>;(该方法始终返回object,因此C#代码可以是:{ {1}},88 + 90"hello world"等),将其保存到文件中并使用this.ToString()进行编译,然后在我的程序中运行。

存储的C#代码可以使用基类中的一些方法。

这个方案非常有效。

现在,我将使用CSharpCodeProvider来执行此操作,以避免编译步骤。

这是否可能,如果可行,该如何做?

1 个答案:

答案 0 :(得分:1)

  

现在,我将使用Reflection.Emit来执行此操作,以避免编译步骤。

这对我来说没什么意义。如果您有要执行的源代码,则基本上有两个选项:

  1. 将其编译为其他可以直接执行的表单。 (像C这样的经典编译语言就像这样工作。)
  2. 将其解析为一些内存中的结构,然后逐个执行。 (经典解释语言就像这样工作,就像旧浏览器中的JavaScript一样。)
  3. 由于虚拟机和中间语言等原因,事情实际上并不像现在这么简单,但这些都是基本选择。

    如果您不想使用CodeDOM,则会有两个选择(对应上面的两个选项):

    1. 解析代码,然后从中创建一些可执行的表单,可能使用Reflection.Emit
    2. 解析代码并直接执行结果。您不需要Reflection.Emit
    3. 选择1意味着您需要实现完整的C#编译器。选择2意味着你需要实现一半的C#编译器,以及你的内存结构的解释器。在这两种情况下,它都是一个巨大的项目,你不会真的“避免编译步骤”。