首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reflection.Emit对CodeDOM

Reflection.Emit对CodeDOM
EN

Stack Overflow用户
提问于 2010-03-02 21:29:16
回答 3查看 15.3K关注 0票数 53

使用Reflection.Emit库相对于CodeDOM在运行时动态生成代码有哪些优缺点?

我试图在基于运行时XML形式的元数据的系统中生成一些(相对复杂的)动态类。我将生成扩展应用程序集中现有类的类,实现其他接口、添加方法以及覆盖虚拟和抽象成员。

在深入实现之前,我需要确保选择合适的技术。任何关于这些不同的代码生成技术有何不同的信息都是有帮助的。此外,任何关于简化或简化工作的开源库的信息都会对任何一个API都很有用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-02 22:54:43

我认为CodeDOM和Reflection.Emit的要点如下:

  • CodeDom生成C#源代码,通常用于生成作为解决方案的一部分并在IDE中编译的代码(例如,LINQ类、WSDL、XSD都是这样工作的)。在此场景中,还可以使用部分类自定义生成的代码。它效率较低,因为它生成C#源代码,然后运行编译器来解析它(再次!)并进行编译。您可以使用相对较高级别的构造(类似于loops.
  • Reflection.Emit表达式和语句)生成代码,例如loops.
  • Reflection.Emit生成IL,因此它直接生成也只能存储在内存中的程序集。因此,更多的efficient.You必须生成低级别的IL代码(值存储在堆栈中;循环必须使用跳转来实现),因此生成更复杂的逻辑有点困难。

一般来说,我认为Reflection.Emit通常被认为是在运行时生成代码的首选方式,而在编译前生成代码时,CodeDOM则是首选的方法。在您的场景中,两者都可能工作得很好(尽管CodeDOM可能需要更高的权限,因为它实际上需要调用C#编译器,这是任何.NET安装的一部分)。

另一种选择是使用Expression class。在.NET 4.0中,它允许您生成相当于C#表达式和语句的代码。但是,它不允许生成类。因此,您可以将其与Reflection.Emit结合起来(生成将实现委托给使用Expression生成的代码的类)。对于某些场景,您可能并不真正需要完整的类层次结构--通常,动态生成的委托字典(如Dictionary<string, Action> )可能足够好(当然,这取决于您的确切场景)。

票数 66
EN

Stack Overflow用户

发布于 2010-03-02 22:56:42

针对CodeDom的代码更容易维护,因为您生成的是C#代码,而不是IL (比IL更多的人可以读取C# )。此外,如果您的CodeDom代码出错,您将得到一个编译器错误;如果您生成无效的IL,您将得到一个致命的异常或崩溃。

但是,由于CodeDom调用了csc.exe编译器,所以要准备好使用代码有点慢。使用Reflection.Emit,您可以直接将代码生成到内存中。

在大多数情况下,CodeDom可能都很好;XmlSerializer和WinForms设计人员使用它。

票数 18
EN

Stack Overflow用户

发布于 2010-03-02 21:35:08

您可能想看看ExpandoObject。不过,它只是.NET 4.0。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2366921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档