我在数据库表中存储了一些C#代码。
我把基类的全部代码放在一个字符串中。
有了存储的C#代码,我向类中添加了一个名为m1
的方法,该方法包含一个return <<some C# code>>;
(该方法总是返回object
,因此C#代码可以是:88 + 90
、"hello world"
、this.ToString()
等),将其保存到一个文件中,并使用CSharpCodeProvider
进行编译,然后在我的程序中运行它。
存储的C#代码可以使用基类中的一些方法。
这个方案效果很好。
现在,我将使用Reflection.Emit
来完成此操作,以避免编译步骤。
这可能吗?如果可能的话,该怎么做?
现在,我想使用
Reflection.Emit
来完成这项工作,以避免编译步骤。
这对我来说没有多大意义。如果你有想要执行的源代码,你基本上有两个选项:
- 将其编译为其他可以直接执行的形式。(像C这样的经典编译语言是这样工作的。)
- 把它解析成内存中的一些结构,然后一块一块地执行。(经典的解释语言是这样工作的,就像旧浏览器中的JavaScript一样。)
由于虚拟机和中间语言等原因,现在的事情实际上并没有那么简单,但这些都是基本的选择。
如果你不想使用CodeDOM,那就有两个选择(对应于上面的两个选项):
- 分析代码,然后从中创建一些可执行表单,可能使用
Reflection.Emit
- 解析代码并直接执行结果。你不需要
Reflection.Emit
选择1意味着您需要实现完整的C#编译器。选择2意味着您需要实现一半的C#编译器,再加上内存结构的解释器。在这两种情况下,这都是一个巨大的项目,你不会真正"避免编译步骤"。