Reflection in .net
最近在看设计模式的一些东西,在讲到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相关推荐
- PHP的Reflection反射机制
原文地址: http://www.nowamagic.net/php/php_Reflection.php PHP5添加了一项新的功能:Reflection.这个功能使得程序员可以 reverse-e ...
- Java Reflection(十):数组
原文地址 作者: Jakob Jenkov 译者:叶文海(yewenhai@gmail.com) 内容索引 java.lang.reflect.Array 创建一个数组 访问一个数组 获取数组的Cla ...
- 【Java】反射( reflection)机制 详解
目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...
- 我的实用设计模式 - Simple Factory和Reflection
更新1:使用as转换数据类型. 在上篇文章 我的实用设计模式 - Simple Factory,Factory Method和Abstract Factory 讲述了Simple Factory,Fa ...
- C#反射(Reflection)详解
1. 什么是反射 2. 命名空间与装配件的关系 3. 运行期得到类型信息有什么用 4. 如何使用反射获取类型 5. 如何根据类型来动态创建对象 6. 如何获取方法以及动态调用方法 7. 动态创建委托 ...
- java的reflection
Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.例如,使用它能获得 Java 类中 ...
- Go 语言:The Laws of Reflection 中文版
翻译了一篇 Go 官方博客介绍反射的文章: 原文地址 免翻墙版 简介 在计算机科学中,反射是一种在运行时检测自身结构(类型)的能力,反射构成元编程的基础,也是混乱的来源. 在这篇文章中我们会尝试澄清 ...
- Caused by: org.apache.ibatis.reflection.ReflectionException我碰到的情况,原因不唯一
映射文件: <select id="selectKeyByUserId" resultMap="Xxx"> <![CDATA ...
- java反射机制--reflection
反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍: Reflection is ...
- java reflection list_Java Reflection(九):泛型
我常常在一些文章以及论坛中读到说Java泛型信息在编译期被擦除(erased)所以你无法在运行期获得有关泛型的信息.其实这种说法并不完全正确的,在一些情况下是可以在运行期获取到泛型的信息.这些情况其实 ...
最新文章
- Python3 的多线程使用:_thread,threading,multiprocessing
- 解决eclipse project前出现红色感叹号 但没有提示错误出在什么地方build path jar包也没报错...
- JAVA设计模式:代理模式
- 以太坊geth结构解析和源码分析
- 2021已去,2022未来
- 疯子的算法总结11--次小生成树+严格次小生成树
- 几个常用的正则表达式
- 在caffe中使用hdf5的数据
- 小程序中利用Moment.js格式时间
- poj1833 排列
- QQ 被曝搜集浏览器历史记录;饿了么回应骑手自焚;原锤子团队被合并暂停手机研发;| 极客头条...
- CF915E Physical Education Lessons(珂朵莉树)
- POJ 3415 Common Substrings(后缀数组 + 单调栈)题解
- 产品设计体会(2002)产品设计的五个层次
- linux 系统内存占用高,linux free 命令以及系统内存占用过高的处理方法
- 淘淘商城:显示查询页面
- MCMC采样算法理解
- mysql 通讯录的实现_mysql中文排序并实现仿手机通讯录
- MySQL查询效率问题
- 小米6不显示与电脑连接到服务器,小米6怎么连接不上电脑没反应怎么办
热门文章
- 1 State Hook
- ASP.NET Web API 记录请求响应数据到日志的一个方法
- vue学习之路.02
- HDU 2049 不容易系列之(4)——考新郎( 错排 )
- RichTextBox 右键显示 ContextMenuTrip
- Android面试,BroadCastReceiver的两种注册方式的异同
- 静态时序分析——On-chip Variation
- halcon rectangle1_domain缩减图像域为矩形
- HALCON示例程序board.hdev检测电路板焊锡有无程序剖析
- C++和Opencv4.5 实现全景图像拼接