汨罗网站建设,中国建设领域专业人员网站,西安有做网站的吗,wordpress yusi最近在看设计模式的一些东西#xff0c;在讲到builder模式中使用到了c#的反射机制#xff0c;从网上找了写资料#xff0c;整理如下#xff1a; 在C#中#xff0c;我们要使用反射#xff0c;首先要搞清楚以下命名空间中几个类的关系: System.Reflection命名空间(1) App… 最近在看设计模式的一些东西在讲到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,Version1.0.0.0,culturezh-CN,PublicKeyToken47887f89771bc57f”. 那么,使用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,Version1.0.0.0,culturezh-CN,PublicKeyToken47887f89771bc57f”. 那么,使用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