最近在看设计模式的一些东西,在讲到builder模式中使用到了c#的反射机制,从网上找了写资料,整理如下:

在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: 
 System.Reflection命名空间
(1)  AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
(2)  Assembly:程序集类
(3)  Module:模块类
(4)  Type:使用反射得到类型信息的最核心的类
他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type. AppDomain这个类我们等下再来讲解。我们先关注Assembly个类,在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFrom和LoadWithPartialName三个Assembly的静态方法.
       先来讲解Assembly.Load方法,该方法会有多个重载版本,其中一个就是提供程序集的详细信息,即程序集的标识,包括程序集的名称,版本,区域信息,公有密钥标记,全部都是以一个字符串的形式提供,例如:"MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f”.
             那么,使用Assembly.Load加载程序集的顺序是怎样的呢?首先它会去全局程序集缓存查找,然后到应用程序的根目录查找,最后会到应用程序的私有路径查找。
             当然,如果你使用的是弱命名程序集,也即只给出程序集的名称,那么这个时候,CLR将不会在程序集上应用任何安全或者部署策略,而且Load也不会到全局缓存程序集中查找程序集。
Assembly.Load("")的使用说明如下;  
  并不是命名空间。常用的是程序集名称,也就是dll的名称  
    重载列表    
  名称     说明      
  Assembly.Load   (AssemblyName)     在给定程序集的   AssemblyName   的情况下,加载程序集。    
  由   .NET   Compact   Framework   支持。     
  Assembly.Load   (Byte[])     加载带有基于通用对象文件格式   (COFF)   的图像的程序集,该图像包含已发出的程序集。将该程序集加载到调用方的域。      
  Assembly.Load   (String)     通过给定程序集的长格式名称加载程序集。 
  由   .NET   Compact   Framework   支持。     
  Assembly.Load   (AssemblyName,   Evidence)     在给定程序集的   AssemblyName   的情况下,加载程序集。使用提供的证据将该程序集加载到调用方的域中。      
  Assembly.Load   (Byte[],   Byte[])     加载带有基于通用对象文件格式   (COFF)   的图像的程序集,该图像包含已发出的程序集。      
  Assembly.Load   (String,   Evidence)     通过给定的程序集的显示名称来加载程序集,使用提供的证据将程序集加载到调用方的域中。
  Assembly.Load   (Byte[],   Byte[],   Evidence)     加载带有基于通用对象文件格式   (COFF)   的图像的程序集,该图像包含已发出的程序集。

关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
而不管在哪一层写这段代码其中的("程序集")读取的实际是web层bin文件夹下的dll,也就是说你反射的类的程序集dll在web层的bin下必须有
注意CreateInstance()一定是命名空间.类名,否则创建的实例为空
Assembly.Load("程序集名")
Assembly.LoadFrom("程序集实际路径"

http://space.itpub.net/12639172/viewspace-442007

最近看了一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结。 
       对于反射的总结,我想从以下几个方面展开,首先是反射程序集,模块,类的成员以及成员的一些信息;接下来就是动态调用类的成员方法;第三个方面就动态产生程序集,模块和类以及类的成员。好了,现在就让我们从反射各种信息开始吧 
       在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: 
              System.Reflection命名空间 
(1)   AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器 
(2)   Assembly:程序集类 
(3)   Module:模块类 
(4)   Type:使用反射得到类型信息的最核心的类 
他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type. 
       AppDomain这个类我们等下再来讲解。我们先关注Assembly个类 
        在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFrom和LoadWithPartialName三个Assembly的静态方法. 
        先来讲解Assembly.Load方法,该方法会有多个重载版本,其中一个就是提供程序集的详细信息,即程序集的标识,包括程序集的名称,版本,区域信息,公有密钥标记,全部都是以一个字符串的形式提供,例如:"MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f”. 
              那么,使用Assembly.Load加载程序集的顺序是怎样的呢?首先它会去全局程序集缓存查找,然后到应用程序的根目录查找,最后会到应用程序的私有路径查找。 
              当然,如果你使用的是弱命名程序集,也即只给出程序集的名称,那么这个时候,CLR将不会在程序集上应用任何安全或者部署策略,而且Load也不会到全局缓存程序集中查找程序集。 
       测试加载弱命名程序集的例子如下: 
(1)   新建一个控制台应用程序的工程,同时勾选创建解决方案 
(2)   在解决方案中新建一个类库的项目,随便写一个类和一个方法 
(3)   在控制台项目中,首先不添加引用,直接在Main方法中添加如下代码: 
Assembly assembly = Assembly.Load("MyAssembly"); 
                  if (assembly != null) 
                  { 
                        Console.WriteLine("加载成功"); 
                   } 
       执行程序,会抛出异常,说找不到该程序集。什么原因呢?因为我们使用的是弱命名程序集,Load方法不会去全局程序集缓存中查找,而该应用程序目录下又没有该程序集,所以程序找不到。这个时候,我们把程序稍微改一下,不用添加代码,只需添加对MyAssembly的引用,重新运行程序,加载成功了。 
      接下来,我们就要看看Load怎么加载强命名程序集了,这个步骤稍微有些复杂。还是刚才的项目,找到MyAssembly.dll程序集所在的目录,一般在bin\Debug目录下 
(1)生成密钥对文件 
sn –k MyAssemblyKey.keys 
你也可以自己随便起一个密钥对文件名 
(2)生成公钥文件

sn –p  MyAssemblyKey.keys MyAssemblyPublicKey.PublicKey 
注:查看公钥命令:sn –tp MyAssemblyPublicKey.PublicKey 
  
(3)创建强命名程序集。 
很简单,只需要在声明命名空间的那句代码上加上如下特性: 
[assembly:AssemblyKeyFileAttribute(@”D:\Test\MyAssemblyKey.keys”)] 
  
(4)   编译项目 
(5)   将程序集添加到程序集全局缓存 
gacutil –i MyAssembly.dll 
这个时候,转到加载程序集的项目中,将Load方法中的参数改为”程序集名,Version=版本,culture=区域信息,PublicKeyToken=公钥“,然后再去掉对程序集的引用,我们会发现,程序运行成功。表明Load到全局缓存区查找到了该程序集。 
       使用Load方法加载程序集,特别是强命名程序集,能在程序集上应用安全和部署策略,推荐使用该方法动态加载程序集,至于LoadFrom和LoadWithPartialName,我们下次会做一些简单的介绍,同时也希望有软友能指出文中的错误或者遗漏的地方。下回见。

http://dev.firnow.com/course/1_web/webjs/200877/132108_2.html

转载于:https://www.cnblogs.com/xuqiang/archive/2010/07/20/1953594.html

Reflection in .net相关推荐

  1. PHP的Reflection反射机制

    原文地址: http://www.nowamagic.net/php/php_Reflection.php PHP5添加了一项新的功能:Reflection.这个功能使得程序员可以 reverse-e ...

  2. Java Reflection(十):数组

    原文地址 作者: Jakob Jenkov 译者:叶文海(yewenhai@gmail.com) 内容索引 java.lang.reflect.Array 创建一个数组 访问一个数组 获取数组的Cla ...

  3. 【Java】反射( reflection)机制 详解

    目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...

  4. 我的实用设计模式 - Simple Factory和Reflection

    更新1:使用as转换数据类型. 在上篇文章 我的实用设计模式 - Simple Factory,Factory Method和Abstract Factory 讲述了Simple Factory,Fa ...

  5. C#反射(Reflection)详解

    1. 什么是反射 2. 命名空间与装配件的关系 3. 运行期得到类型信息有什么用 4. 如何使用反射获取类型 5. 如何根据类型来动态创建对象 6. 如何获取方法以及动态调用方法 7. 动态创建委托 ...

  6. java的reflection

    Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.例如,使用它能获得 Java 类中 ...

  7. Go 语言:The Laws of Reflection 中文版

    翻译了一篇 Go 官方博客介绍反射的文章: 原文地址 免翻墙版 简介 在计算机科学中,反射是一种在运行时检测自身结构(类型)的能力,反射构成元编程的基础,也是混乱的来源. 在这篇文章中我们会尝试澄清 ...

  8. Caused by: org.apache.ibatis.reflection.ReflectionException我碰到的情况,原因不唯一

    映射文件: <select id="selectKeyByUserId"  resultMap="Xxx">         <![CDATA ...

  9. java反射机制--reflection

    反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍:    Reflection is ...

  10. java reflection list_Java Reflection(九):泛型

    我常常在一些文章以及论坛中读到说Java泛型信息在编译期被擦除(erased)所以你无法在运行期获得有关泛型的信息.其实这种说法并不完全正确的,在一些情况下是可以在运行期获取到泛型的信息.这些情况其实 ...

最新文章

  1. Python3 的多线程使用:_thread,threading,multiprocessing
  2. 解决eclipse project前出现红色感叹号 但没有提示错误出在什么地方build path jar包也没报错...
  3. JAVA设计模式:代理模式
  4. 以太坊geth结构解析和源码分析
  5. 2021已去,2022未来
  6. 疯子的算法总结11--次小生成树+严格次小生成树
  7. 几个常用的正则表达式
  8. 在caffe中使用hdf5的数据
  9. 小程序中利用Moment.js格式时间
  10. poj1833 排列
  11. QQ 被曝搜集浏览器历史记录;饿了么回应骑手自焚;原锤子团队被合并暂停手机研发;| 极客头条...
  12. CF915E Physical Education Lessons(珂朵莉树)
  13. POJ 3415 Common Substrings(后缀数组 + 单调栈)题解
  14. 产品设计体会(2002)产品设计的五个层次
  15. linux 系统内存占用高,linux free 命令以及系统内存占用过高的处理方法
  16. 淘淘商城:显示查询页面
  17. MCMC采样算法理解
  18. mysql 通讯录的实现_mysql中文排序并实现仿手机通讯录
  19. MySQL查询效率问题
  20. 小米6不显示与电脑连接到服务器,小米6怎么连接不上电脑没反应怎么办

热门文章

  1. 1 State Hook
  2. ASP.NET Web API 记录请求响应数据到日志的一个方法
  3. vue学习之路.02
  4. HDU 2049 不容易系列之(4)——考新郎( 错排 )
  5. RichTextBox 右键显示 ContextMenuTrip
  6. Android面试,BroadCastReceiver的两种注册方式的异同
  7. 静态时序分析——On-chip Variation
  8. halcon rectangle1_domain缩减图像域为矩形
  9. HALCON示例程序board.hdev检测电路板焊锡有无程序剖析
  10. C++和Opencv4.5 实现全景图像拼接