0

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

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

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

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

这个方案效果很好。

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

这有可能吗?如果可以,该怎么做?

4

1 回答 1

1

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

这对我来说没有多大意义。如果您有要执行的源代码,则基本上有两种选择:

  1. 将其编译为其他可以直接执行的形式。(像 C 这样的经典编译语言就是这样工作的。)
  2. 将其解析为一些内存结构,然后逐个执行。(经典的解释语言就是这样工作的,就像旧浏览器中的 JavaScript。)

由于虚拟机和中间语言等原因,现在事情实际上并不那么简单,但这些是基本的选择。

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

  1. 解析代码,然后从中创建一些可执行形式,可能使用Reflection.Emit.
  2. 解析代码并直接执行结果。你不需要Reflection.Emit那个。

选择 1 意味着您需要实现完整的 C# 编译器。选择 2 意味着您需要实现 C# 编译器的一半,以及内存结构的解释器。在这两种情况下,这将是一个巨大的项目,你不会真正“避免编译步骤”。

于 2012-11-21T21:31:54.743 回答