Reflection in .net

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

 

C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: 
 System.Reflection命名空间
(1)  AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
(2)  Assembly:程序集类
(3)  Module:模块类
(4)  Type:使用反射得到类型信息的最核心的类
他们之间是一种从属关系,也就是说,一个AppDomain可以包含NAssembly,一个Assembly可以包含NModule,而一个Module可以包含NType. AppDomain这个类我们等下再来讲解。我们先关注Assembly个类,在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFromLoadWithPartialName三个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可以包含NAssembly,一个Assembly可以包含NModule,而一个Module可以包含NType. 
       AppDomain这个类我们等下再来讲解。我们先关注Assembly个类 
        在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFromLoadWithPartialName三个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山西万荣盛装迎新春 首届群众文化艺术节启幕

山西万荣盛装迎新春,首届群众文化艺术节启幕。 李继旺 摄 山西万荣盛装迎新春,首届群众文化艺术节启幕。 李继旺 摄 中新网太原1月29日电 (任丽娜)璀璨闪耀的宝鼎广场花灯展、激情活力的群众文体赛事、精彩纷呈的红火热闹、精品年货展销、李家大院游园会…

MySQL 隐式转换 字符串和整型说明

MySQL 隐式转换 字段类型定义 CREATE TABLE user (id int(10) NOT NULL AUTO_INCREMENT COMMENT 编号,/* ...... */name varchar(10) NOT NULL DEFAULT COMMENT 姓名,/* ...... */PRIMARY KEY (id),KEY idx_name (name,nickname),/* ...... */ ) ENGINEInnoDB DEFAULT CHARSE…

安装vs2017出现闪退现象_Adobe Reader 闪退

在我们的日常办公、学习中经常会涉及到 PDF 文件,免不了需要处理 PDF 文件如:PDF转Word、PDF合并、导出成图片、PDF解密、PDF转PPT、PDF加水印、PDF签名等等。PDF是与平台无关的文件格式,无论在哪种打印机上都可保证精确的颜色和准确的打印效…

从Vue.js源码中我学到的几个实用函数

大家好,我是若川。欢迎加我微信 ruochuan12,长期交流学习。今天推荐Vuejs源码中几个实用的方法。如果想看Vuejs源码,不知道如何下手,一般推荐配置Sourcemap,针对单个问题调试来看,如何调试Vuejs源码&#x…

real类型_如何使用REAL方法对您的Web内容进行现实检查

real类型Web内容审核模板 (Web content audit template) I recently completed a website audit project for a nonprofit organization through CatchAFire.org. As part of the website audit, I audited every key page’s content, looking for areas of opportunity.我最近…

青海行--(7月26日)翻越祁连山

嘉峪关是最值得一写的,虽然也是著名的旅游城嘉峪关景点是国家AAAAA级景区,但与敦煌完全不一样,没有人山人海的游客,门票也不贵,才10&a…

TikTok真题第1天 | 666.路径和IV、 207.课程表、210.课程表||

666.路径和IV 题目链接:666.路径和IV 解法: 参考这篇题解:【LeetCode - 666】路径和 IV_力扣666路径总和4-CSDN博客 关键点在于: (1)使用map来存node:key 为整数的前两位,value…

导出Excel

2019独角兽企业重金招聘Python工程师标准>>> 思路: 1, 引入Excel类库; 2, 创建一个模板; 3, 将数据填充进去; 4, 生成文件; 下面是一个简单的示例 $phpExcelObj new PHPExcel(); $titleMap self::TITLE_MAP; //设置表头 $i 0; foreach ($titleMap as $key > $…

CentOS系统更换yum源(repomd.xml not found解决方案)

CentOS系统更换yum源 问题 当初瞎鼓捣服务器,更换yum源为aliyun的,奈何阿里的源最近全部打不开,导致yum安装不了,一直报错: http://mirrors.aliyun.com/centos/6/os/x86_64/repodata/repomd.xml: [Errno 14] PYCURL E…

在类中用class时数据是共有还是私有_jvm学习笔记之class文件的加载、初始化

编写的java文件在要真正运行时,会首先被编译成 “.class"结尾的二进制文件,然后被虚拟机加载。那么在虚拟机中一个class文件要成为java实例,需要经历好几个步骤:1、装载:装载阶段由三个基本动作完成,要…

所有前端都要看的2D游戏化互动入门基础知识

背景现在越来越多的公司和APP开始使用游戏化的方式去做产品了,所谓游戏化,是指在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用的方法。支付宝里面的蚂蚁庄园、蚂蚁森林,通过游戏和公益的结合实现用户的…

江苏一动物园现“旋转活马” 园方:创意来自马术训练

中新网南通1月31日电 (记者唐娟)“旋转马设备采用同时容纳六匹马的遛马器组装而成,对马匹没有任何伤害,初衷是希望给小朋友一种全新体验,这才有了这个创意项目。”1月31日,针对活马版“旋转木马”引发的热议,江苏南通森…

Byte数组转换成string 的方法积累

.net的加密算法,返回的都是byte[] 类型,在存贮起来让人非常头疼,最简单的方法就是把byte[]转换成string来存贮,当然如果数据量大的话,另当别论。 所以我就把byte[]转换成string的方法做一个简单的积累与分析。目前有3种…

加快信息化建设对地方发展的_加快设计师职业发展的9种方法

加快信息化建设对地方发展的重点 (Top highlight)Over the past few months, I have had an increase in conversations with design students from various institutions, as well as early, to senior-level designers, researchers, & product managers from various co…

Docker:Nginx-Redis-Mysql-PHP 部署

Docker:Nginx-Redis-Mysql-PHP 部署 网络桥接 Docker容器之间默认网络隔离,需要使用桥接网络进行互通 创建网络 docker network create net-local docker network ls NETWORK ID NAME DRIVER SCOPE da9c8fc3dc80 bridge bridge local 78641…

epoll监听文件_介绍一下 Android Handler 中的 epoll 机制?

介绍一下 Android Handler 中的 epoll 机制?目录:IO 多路复用select、poll、epoll 对比epoll APIepoll 使用示例Handler 中的 epoll 源码分析IO 多路复用IO 多路复用是一种同步 IO 模型,实现一个线程可以监视多个文件句柄。一旦某个文件句柄就…

前端工程师的一大神器——puppeteer

大家好,我是若川。欢迎加我微信 ruochuan12,长期交流学习。今天推荐神器puppeteer,我猜有挺多人不知道。文章不长,看完有空也可以试玩。我18年也写过一篇puppeteer爬取生成pdf的文章,时间真快。前端使用puppeteer 爬虫…

selenium界面元素定位

一、 Selenium界面元素定位 本文元素定位以das2为例 #导入包 from selenium import webdriver #打开火狐驱动 driverwebdriver.Firefox() #访问网址 driver.get("http://192.168.3.217:8080/das/seatlogin.jsp ") 进行web页面自动化测试,对页面上…

vue.js ui_UI / UX开发:考虑Vue.js

vue.js uiBecause sometimes we have to add logic to our concepts, and Vue makes it a whole lot easier.因为有时我们必须在概念中添加逻辑,而Vue使其变得更加容易。 FULL DISCLOSURE: THIS IS NOT A COMPLETE JAVASCRIPT OR VUE COURSE. There’s no way I co…

Silverlight学习笔记十七BingMap(三)之地图的地区标识

如果我们需要在Bing Maps中加入一个小图钉标记&#xff0c;该如何实现了&#xff1f; Bing Maps控件已经为我们提供了这个功能&#xff0c;在Microsoft.Maps.MapControl名称空间下提供了实现图钉应用的图钉层Pushpin类用该类来实现普通标识 在Xaml中添加<map:Pushpin Locati…