我可以使用Reflection.Emit生成代码并将生成的代码保存在.cs文件中,或者我可以使用CodeDom吗?

时间:2011-06-28 03:26:04

标签: c# code-generation runtime reflection.emit codedom

我想编写代码生成器并使用mvp模式保存这些代码,我可以使用Reflection.Emit作为解决方案或CodeDom更好吗?

EDIT --------------

我必须完成2项工作,首先我要在运行时编译此代码并运行它,然后再生成源代码作为选项。

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字节码指令,即使您熟悉汇编代码也是一项相当困难和复杂的任务,如果您想要的是相当简单和快速的实现,可能并不理想。检查CILCIL instructions list上的维基百科文章,以获得第一印象。

答案 1 :(得分:1)

如果您想要选择查看C#源代码,我会说使用CodeDom。 Reflection.Emit呈现IL,但将其转换为可用的C#代码并不容易。