(转)C# Assembly.Load 使用
在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的情况下,加载程序集。 由.NETCompactFramework支持。
Assembly.Load(Byte[])加载带有基于通用对象文件格式(COFF)的图像的程序集,该图像包含已发出的程序集。将该程序集加载到调用方的域。
Assembly.Load(String)通过给定程序集的长格式名称加载程序集。 由.NETCompactFramework支持。
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("程序集实际路径")
什么是Assembly(程序集)?
Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。
Assembly能干什么?
我们可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息。
一个简单的演示实例:
1.建立一个Console工程名为:NamespaceRef
2.写入如下代码:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Reflection;
- namespace NamespaceRef
- {
- class Program
- {
- static void Main(string[] args)
- {
- Country cy;
- String assemblyName = @"NamespaceRef";
- string strongClassName = @"NamespaceRef.China";
- // 注意:这里类名必须为强类名
- // assemblyName可以通过工程的AssemblyInfo.cs中找到
- cy = ountry)Assembly.Load(assemblyName).CreateInstance(strongClassName);
- Console.WriteLine(cy.name);
- Console.ReadKey();
- }
- }
- class Country
- {
- public string name;
- }
- class Chinese : Country
- {
- public Chinese()
- {
- name = "你好";
- }
- }
- class America : Country
- {
- public America()
- {
- name = "Hello";
- }
- }
- class China: Country
- {
- public China()
- {
- name = "这是要调用的类";
- }
- }
- }
由于Assembly的存在给我们在实现设计模式上有了一个更好的选择。我们在开发的时候有时候会遇到这样的一个问题,根据对应的名称来创建指定的对象。如:给出chinese就要创建一个chinese对象,以前我们只能这样来写代码:
那么如果我们有很长的一系列对象要创建,这样的代码维护起来是很困难的,而且也不容易阅读。现在我们可以通过在外部文件定义类的程序集名称和类的强名称来获得这样一个实例,即易于理解,又增强了扩展性还不用修改代码。
cy=(Country)Assembly.Load(assemblyName).CreateInstance(strongClassName);
创建一个文件,在解决方案里有两部分:声明引用和代码实体.
声明引用是:using System,表示引用了System名称空间下的所有成员,就是引用了所有system派生出来的类.
还有一个叫做AssemblyInifo.cs的文件.
Assembly是用于建立.net应用程序的一部分,他带有版本信息和自描述信息,并可以重复使用.
一个简单的Assembly可以是单个可执行文件,包含发布和版本信息,但通常会包含多个可执行文件和资源文件.
Assembly定义了安全,发布和类型解析,他是可以执行的最小单元,运行环境只能执行位于Assembly中的代码.
Assembly对于公共语言运行环境(Common LanguageRuntime,CLR) 非常重要,因为CLR是用他来定位和安全的执行代码的.
AssemblyTitle 标题
AssemblyDescription 描述
AssemblyConfiguration 配置
AssemblyComany 公司
AssemblyProduct 产品
AssemblyCopyright 版权
AssemblyTrademark 商标
AssemblyCulture 区域
Assembly Version 版本信息,包括四个段值:主版本号,副版本号,修订号,编译次数.
文章转载自https://blog.csdn.net/jbjwpzyl3611421/article/details/10999777
(转)C# Assembly.Load 使用的更多相关文章
- [转]C#反射-Assembly.Load、LoadFrom与LoadFile进阶
关于.NET中的反射,常用的有三个方法: Assembly.Load()Assembly.LoadFrom()Assembly.LoadFile() 下面说说这三个方法的区别和一些细节问题 1. As ...
- Assembly.Load(path).CreateInstance 反射出错解决办法
最近采用工厂模式反射DAL层出现一些问题,所以自己想写一下自己认为标准解决的思路和解决方法以备后用. 1.这是项目结构 2.这是DALFactory 反射代码 #region 创建对象(不使用缓存) ...
- C#中的反射 Assembly.Load() Assembly.LoadFrom()
一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
关于反射Assembly.Load("程序集").CreateInstance("命名空间.类") 而不管在哪一层写这段代码其中的("程序集" ...
- 工厂模式Assembly.Load(path).CreateInstance 反射出错解决办法
项目结构: DALFactory 反射代码反射 //使用缓存 private static object CreateObject(string AssemblyPath,string classNa ...
- C#反射-Assembly.Load、LoadFrom与LoadFile
反射Demo: public class Person { public int Age; public void SayHello() { Console.WriteLine("Hello ...
- Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别!
参考: http://www.cnblogs.com/benwu/archive/2009/10/24/1589096.html http://www.cnblogs.com/xuefeng1982/ ...
- Assembly.Load动态加载程序集而不占用文件 z
方式一:占用文件的加载 Assembly assembly = Assembly.Load(path); 用上面的方法可以动态的加载到dll,但是用这种方法加载到的dll一直到程序运行结束都是占用的d ...
- Assembly.Load 详解(c#)
我们在使用C# 语言的Assembly.Load 来加载托管程序集并使用反射功能时,一般需要先通过Assembly.Load(), Assembly.LoadFrom() 等方法将目标托管程序集加载到 ...
随机推荐
- php 操作 mysql 数据库常用方法集合
参考: https://www.runoob.com/php/php-pdo.html https://www.cnblogs.com/feng18/p/6523646.html https://bl ...
- Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D) - 记忆化搜索
Palindromic characteristics of string s with length |s| is a sequence of |s| integers, where k-th nu ...
- kaptcha验证码实现,配合spring boot使用
一.kaptcha介绍 Kaptcha是谷歌放在github上的一个验证码jar包,我们可以简单配置属性实现验证码的验证功能. kaptcha参数设置如下所示: Constant 描述 默认值 kap ...
- Jordan 块的几何
设 $V$ 是复数域 $\mathbb{C}$ 上的 $n$ 维线性空间, $\varphi$ 是 $V$ 上的线性变换, $A\in M_n(\mathbb{C})$ 是 $\varphi$ 在某组 ...
- eMMC之分区管理、总线协议和工作模式【转】
本文转载自:https://blog.csdn.net/u013686019/article/details/66472291 一.eMMC 简介 eMMC 是 embedded MultiMedia ...
- P4306 [JSOI2010]连通数
思路 要求求每个点能到达的点数就是传递闭包 然后n^3Floyd可做,但是n=2000,然后bitset压位 复杂度\(O(\frac{n^3}{32})\),能过 代码 #include <c ...
- P3833 [SHOI2012]魔法树
思路 树剖板子 注意给出点的编号是从零开始的 代码 #include <cstdio> #include <algorithm> #include <cstring> ...
- 怎么用mybatis
一般mybatis的用法.mapper-spring-boot-starter + PageHelper分页插件. 1,PageHelper分页插件 . https://blog.csdn.net/ ...
- 日系插画学习笔记(一):SAI软件基础
检测驱动是否安装正确:1.画笔没有压感,线条没有粗细变化2.画笔线条有锯齿 一.文件:新建文件:预设尺寸:一般选择A3(8k),A4(16k),A5(32k)作业要求:A4A5 - 300dpi,像素 ...
- -第3章 jQuery方法实现下拉菜单显示和隐藏
知识点 jquery 的引入方式 本地下载引入 在线引入 children 只获取子元素,不获取孙元素 show() 显示. hide() 隐藏. 完整代码 <!-- Author: XiaoW ...