原文: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. Nginx 常用配置整理

    #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...

  2. 55 Jump Game i && 45 Jump Game ii

    Jump Game Problem statement: Given an array of non-negative integers, you are initially positioned a ...

  3. java中的GC(gabage collection)如何工作

    1. “引用记数(reference counting)”是一种简单但速度很慢的垃圾回收技术.每个对象都含有一个引用记数器,当有引用连接至对象时,引用计数加1.当引用离开作用域或被置 为null时,引 ...

  4. JS第二弹:用Jquery组装html标签,输出到页面

    用Ajax从服务端获取数据,遍历到表格中(其实将表格替换了),中间发现不能为新增的元素绑定事件,原来是没有将其作为JQ对象

  5. 浏览器播放rtsp流媒体解决方案

    老板提了一个需求,想让网页上播放景区监控的画面,估计是想让游客达到未临其地,已知其境的状态吧.    说这个之前,还是先说一下什么是rtsp协议吧. RTSP(Real Time Streaming ...

  6. 学生成绩管理C语言版

    [标题]学生成绩管理的设计与实现 [开发语言]C语言 [概要设计]使用结构体存储学生的学号.姓名和成绩信息,实现对学生成绩类的基本操作:增加.删除.查询.排序 [测试数据]按提示输入5组正确的正确的数 ...

  7. windows 上优雅的安装 node 和 npm

    windows 的一键安装包,应该是最简单的 node 安装方式. 其实很多软件,拷贝过来就可以运行,根本不需要所谓的"安装"过程. 新建一个目录专门了管理 node 和 npm  ...

  8. html学习笔记 - 特殊字符

  9. 关于微信分享JSSDK使用需注意的几点问题

    微信公众平台技术文档中有微信JS-SDK说明文档,详情见地址https://mp.weixin.qq.com/wiki 官方给出了使用步骤和DEMO,下面说一下几点需要注意的问题. 1.登录微信公众平 ...

  10. 《JAVA与模式》之命令模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...