原文:http://ayende.com/blog/1606/reflection-emit-vs-codedom

Both technologies allow you to generate executable code at runtime (even though CodeDOM may not have been originally intended for this). This opens up some interesting possibilities (Rhino Mocks and NHibernate, for instnace, uses Dynamic Proxy, which uses Reflection.Emit to generate proxies for object at runtime).

(这两种技术允许你在运行时生成的可执行代码,这开辟了一些有趣的可能性)

Reflection.Emit gives you complete control of the generated IL, while CodeDOM leaves you creating source code dynamically.(Reflection.Emit让你能完全控制IL生成,而CodeDOM让你动态创建源代码)

Reflection.Emit has the following advantages(Reflection.Emit有以下优点):

  • You can generate new classes directly into an existing assembly, this helps reduce memory consumtion.(你可以生成新类,直接放到现有的程序集中,这有助于减少内存消耗)
  • You can generate new methods in a class (.Net 2.0, dynamic methods).(你可以在类中生成新的方法)
  • Significanty faster than any other alternative.(比其他方式要快)

And disadvantages:(Reflection.Emit的缺点)

  • It is rocket science mixed with the black arts. The common path is merely hard, but try doing something like support out/ref values, or handling sealed methods, and you are thrown into a mire of special cases. That is completely ignoring the new stuff in .Net 2.0, like generics, which are such a fun to try to support.(这是科学与巫术的混合。很难用,但是尝试做一些事情,比如支持out/ref值,或者处理密封的方法。完全忽略了.NET 2中的新东西,比如泛型。)
  • It is not debuggable, at all.(几乎不能调试)
  • It is very easy to produce invalid code, and there isn't much information about what is wrong, nor is there much information about how you should go about it.(容易产生无效代码,而且没有太多的错误信息,也没有太多关于你应该如何处理的信息)
  • Side note: Even the C# Compiler can be presuded to produce invalid code in certain instances, just to give you an idea about how hard this thing is.(注意:即便在某些情况下,可以让C#编译器生产无效代码,但这只是让你了解这件事本身有多难)

CodeDOM has the following advantages:(CodeDOM有以下优点)

  • Very easy to understand and use.(简单易用)
  • The generated code is debuggable.(生产的代码可调试)
  • You get a lot more information about the errors, often with how to fix them.(你会得到更多关于错误的信息,通常是关于如何修复它们的)

And disadvantages:(CodeDOM的缺点)

  • You can't incremently add classes to assembly (important for things like Dynamic Proxy). Every time you generate code, it has its own own assembly.(你不能再现有程序集中添加类,每次生成代码,它都有它自己的程序集)
  • You are limited to what you can do within the langauge. There are things you just can't do in code, which are easily possible in Reflection.Emit. There are usually other ways around it, though.(你只能做开发语言支持的事情,有些事情CodeDOM无法实现,但是可以很容易的使用Reflection.Emit来实现,不过这里通常有其他方式解决)
  • Slower than Reflection.Emit, because we are generating the code and then compiling it on the fly. This is usually very little code, so it doesn't really matter, and caching helps quite a bit.(比Reflection.Emit慢,因为我们在程序运行时生产代码并编译代码。如果是少量代码就没什么性能影响,并且使用缓存会有很大帮助)

Given that caching is going to be used anyway, I think that I can ignore most of the performance benefits of using Reflection.Emit, in favor of a much simpler programming model offered by CodeDOM. The only thing that really needs Reflection.Emit is dynamically adding methods to a class, and that is not something that you often need.

(因为可以使用缓存,所以,我们完全可以忽略Reflection.Emit的性能优势,而倾向于CodeDOM的简单实用。只有当你需要向类中动态添加方法,或者向程序集添加类时,才需要考虑使用Reflection.Emit)

【译】Reflection.Emit vs. CodeDOM的更多相关文章

  1. [读行者][学习LinqExpression和Reflection(Emit)]阅读TypeBuilderSample之ExampleFromTheArticle

    前言 关于”读行者“ 俗语有云:"读万卷书,行万里路“.多读一些优秀代码,不仅可以锻炼我们读代码的能力(便于维护或相互交流),还可以吸取很多我们成长所需的知识点.多读,才能开阔我们的眼界,才 ...

  2. System.Reflection.Emit学习

    C#反射发出System.Reflection.Emit学习 分享: 1 一.System.Reflection.Emit概述 Emit,可以称为发出或者产生.与Emit相关的类基本都存在于Syste ...

  3. System.Reflection.Emit摘记

    动态类型在.net中都是用什么类型来表示的.程序集:System.Reflection.Emit.AssemblyBuilder(定义并表示动态程序集)构造函数:System.Reflection.E ...

  4. C#反射发出System.Reflection.Emit学习

    一.System.Reflection.Emit概述 Emit,可以称为发出或者产生.与Emit相关的类基本都存在于System.Reflection.Emit命名空间下.反射,我们可以取得形如程序集 ...

  5. [EF] - 动态创建模型:System.Reflection.Emit + Code First

    动态创建Entity Framework模型并且创建数据库 使用System.Reflection.Emit+Code First model创建以下的一个实体类和DbContext并且创建数据库: ...

  6. ulua、tolua原理解析

    在聊ulua.tolua之前,我们先来看看Unity热更新相关知识. 什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏 ...

  7. 如何快速编写和调试 Emit 生成 IL 的代码

    .NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力.利用这项能力,我们能够在运行时生成一段代码/一个方法 ...

  8. 再谈使用Emit把Datatable转换为对象集合(List<T>)

    一.前因和存在的问题 前面我写了一篇<使用Emit把Datatable转换为对象集合(List<T>)>的博文,其实起源于我自己编写的一个orm工具(见前面几篇博文有介绍),里 ...

  9. DataTable转Entity(Emit版)

    public static List<T> ToList<T>(DataTable dt)        {            List<T> list = n ...

随机推荐

  1. PowerDesigner 12.5破解方法

    PowerDesigner 12.5破解方法 创建于 2017-05-07 22:18:04   一.下载   1 . PowerDesigner 12.5 官方下载地址  http://downlo ...

  2. 罪恶的SEO优化

    1. 基础概念开始 SEO,搜索引擎优化.概括来说就是针对分析搜索引擎的网站收录以及评价规律,来对网站的结构,内容以及其他因素作出一些合理调整,使得网站更容易被搜索引擎收录,并且能够尽量排在搜索引擎自 ...

  3. Gartner:当商业智能成熟度低时,如何加快分析采用率

    文 | 水手哥 本文出自:知乎专栏<帆软数据应用研究院>--数据干货&资讯集中地 根据Gartner近7年的调查结果,71%的受访企业处于低成熟度阶段,也就是Gartner五级BI ...

  4. Redis入门学习

    一.摘要 二.五种数据类型的基本命令操作 三.Redis连接池 四.普通同步方式 五.事务方式(Transactions) 六.管道(Pipelining) 七.管道中调用事务 八.分布式直连同步调用 ...

  5. jQuery选择器的分类

    jQuery选择器的分类 jQuery中有很多分类,大类分为四类,四类里面又分为很多小类,下面就为大家一一介绍,这些选择器的使用和好处,Me用的是jQuery1.8.3的版本 选择器都有哪四类?? 1 ...

  6. Jquery datatable 动态隐藏列(根据有无值)

    一场景: 前端利用datatable初始化的时候会向后端调用数据,需求是 要动态的使某一列根据传回来的一个标志位是否有值来决定显示与否 这是当前传回值有活动优惠幅度的情况下 这是没有活动优惠的情况下 ...

  7. 【JAVAWEB学习笔记】22_ajax

    Js原生Ajax和Jquery的Ajax 学习目标 案例1-异步校验用户名是否存在 案例2-站内查询 一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应 ...

  8. 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)

    我们已经学会构建自己的镜像了.接下来的问题是如何在多个 Docker Host 上使用镜像. 这里有几种可用的方法: 用相同的 Dockerfile 在其他 host 构建镜像. 将镜像上传到公共 R ...

  9. CoreOS, Kubernetes, etcd

    CoreOS CoreOS Container Linux is the leading container operating system, designed to be managed and ...

  10. 12款Linux系统恢复工具

    电脑死机,硬盘崩溃,花巨大的money搞个急救保护器……这都是计算机的阴暗面.时间一直这样走着,走着,不定哪天背点儿.对于电脑损坏造成的损失,着急抓狂毫无意义.相反,使用恰当的工具反而会最小化损失.你 ...