我想编写代码生成器并使用mvp模式保存这些代码,我可以使用Reflection.Emit作为解决方案或CodeDom更好吗?
EDIT --------------
我必须完成2项工作,首先我要在运行时编译此代码并运行它,然后再生成源代码作为选项。
答案 0 :(得分:2)
虽然您可以使用命名空间( System.CodeDom 和 System.Reflection.Emit )实现问题的某些方面,但您无法混合使用两个不同的概念,使用更适合你想做的事情的选项。
如果您只想生成和编译C#\ VB代码,可能需要使用 System.CodeDom :
此命名空间可用于建模 源代码的结构 可以作为来源输出的文件 使用支持语言的代码 由...提供的功能 System.CodeDom.Compiler命名空间。
检查这个关于如何通过CodeDom定义方法的小例子:
// Defines a method that returns a string passed to it.
CodeMemberMethod method1 = new CodeMemberMethod();
method1.Name = "ReturnString";
method1.ReturnType = new CodeTypeReference("System.String");
method1.Parameters.Add( new CodeParameterDeclarationExpression("System.String", "text") );
method1.Statements.Add( new CodeMethodReturnStatement( new CodeArgumentReferenceExpression("text") ) );
// A C# code generator produces the following source code for the preceeding example code:
// private string ReturnString(string text)
// {
// return text;
// }
至于 System.Reflection.Emit ,它用于生成和操作MSIL(Microsoft中间语言),这是由人工可读的最低级编程语言定义的。公共语言基础结构规范,由.NET Framework使用。请注意,MSIL现在称为CIL(通用中间语言):
System.Reflection.Emit命名空间 包含允许编译器的类 或工具发出元数据和微软 中间语言(MSIL)和 可选地在磁盘上生成PE文件。 这些类的主要客户端 是脚本引擎和编译器。
使用这种方法会让您学习CIL字节码指令,即使您熟悉汇编代码也是一项相当困难和复杂的任务,如果您想要的是相当简单和快速的实现,可能并不理想。检查CIL和CIL instructions list上的维基百科文章,以获得第一印象。
答案 1 :(得分:1)
如果您想要选择查看C#源代码,我会说使用CodeDom。 Reflection.Emit呈现IL,但将其转换为可用的C#代码并不容易。