在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.写入如下代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Reflection;
  5. namespace NamespaceRef
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. Country cy;
  12. String assemblyName = @"NamespaceRef";
  13. string strongClassName = @"NamespaceRef.China";
  14. // 注意:这里类名必须为强类名
  15. // assemblyName可以通过工程的AssemblyInfo.cs中找到
  16. cy = ountry)Assembly.Load(assemblyName).CreateInstance(strongClassName);
  17. Console.WriteLine(cy.name);
  18. Console.ReadKey();
  19. }
  20. }
  21. class Country
  22. {
  23. public string name;
  24. }
  25. class Chinese : Country
  26. {
  27. public Chinese()
  28. {
  29. name = "你好";
  30. }
  31. }
  32. class America : Country
  33. {
  34. public America()
  35. {
  36. name = "Hello";
  37. }
  38. }
  39. class China: Country
  40. {
  41. public China()
  42. {
  43. name = "这是要调用的类";
  44. }
  45. }
  46. }

  由于Assembly的存在给我们在实现设计模式上有了一个更好的选择。我们在开发的时候有时候会遇到这样的一个问题,根据对应的名称来创建指定的对象。如:给出chinese就要创建一个chinese对象,以前我们只能这样来写代码:    

  if (strongClassName == "China") 
  {
    cy = new China();  
  }  
  else if (strongClassName == "America")  
  {    
    cy = new America();  
  }

  那么如果我们有很长的一系列对象要创建,这样的代码维护起来是很困难的,而且也不容易阅读。现在我们可以通过在外部文件定义类的程序集名称和类的强名称来获得这样一个实例,即易于理解,又增强了扩展性还不用修改代码。

  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 使用的更多相关文章

  1. [转]C#反射-Assembly.Load、LoadFrom与LoadFile进阶

    关于.NET中的反射,常用的有三个方法: Assembly.Load()Assembly.LoadFrom()Assembly.LoadFile() 下面说说这三个方法的区别和一些细节问题 1. As ...

  2. Assembly.Load(path).CreateInstance 反射出错解决办法

    最近采用工厂模式反射DAL层出现一些问题,所以自己想写一下自己认为标准解决的思路和解决方法以备后用. 1.这是项目结构 2.这是DALFactory 反射代码 #region 创建对象(不使用缓存) ...

  3. C#中的反射 Assembly.Load() Assembly.LoadFrom()

    一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...

  4. 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")

    关于反射Assembly.Load("程序集").CreateInstance("命名空间.类") 而不管在哪一层写这段代码其中的("程序集" ...

  5. 工厂模式Assembly.Load(path).CreateInstance 反射出错解决办法

    项目结构: DALFactory 反射代码反射 //使用缓存 private static object CreateObject(string AssemblyPath,string classNa ...

  6. C#反射-Assembly.Load、LoadFrom与LoadFile

    反射Demo: public class Person { public int Age; public void SayHello() { Console.WriteLine("Hello ...

  7. Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别!

    参考: http://www.cnblogs.com/benwu/archive/2009/10/24/1589096.html http://www.cnblogs.com/xuefeng1982/ ...

  8. Assembly.Load动态加载程序集而不占用文件 z

    方式一:占用文件的加载 Assembly assembly = Assembly.Load(path); 用上面的方法可以动态的加载到dll,但是用这种方法加载到的dll一直到程序运行结束都是占用的d ...

  9. Assembly.Load 详解(c#)

    我们在使用C# 语言的Assembly.Load 来加载托管程序集并使用反射功能时,一般需要先通过Assembly.Load(), Assembly.LoadFrom() 等方法将目标托管程序集加载到 ...

随机推荐

  1. indexOf()/equals/contains

    indexOf():对大小写敏感定义:返回某个指定字符串值在字符串中首次出现位置用法:返回字符中indexof(string)中字串string在父串中首次出现的位置,从0开始!没有返回-1:方便判断 ...

  2. 20145326蔡馨熤《网络对抗》—— Web安全基础实践

    20145326蔡馨熤<网络对抗>—— Web安全基础实践 1.实验后回答问题 (1)SQL注入攻击原理,如何防御. 原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程 ...

  3. body-parser 用法

    1.下载 body-parser 模块  :   npm install body-parser 2.require body-parser 模块(引入),并用一个变量接收(此处栗子变量为 bodyp ...

  4. 你不知道的JavaScript(1)LHS查询和RHS查询

    打算把<你不知道的JavaScript>中的知识点整理下,写点自己的心得,同时也敦促自己看书. 先做个整体的介绍,最后会再给个综合的例子. RHS 查询与简单地查找某个变量的值别无二致,而 ...

  5. 基础选择器,长度与颜色,标签display,嵌套关系,盒模型,盒模型布局

    css基础选择器 # *(统配选择器): 控制html, body,以及body下所有用于显示的标签 # div(标签选择器): 该标签名对应的所有该标签 # .(class选择器)(eg: .div ...

  6. 【Python042--魔法方法:算术运算】

    一.算术魔法方法的举例 1.加法(__add__)的算术运算调用减法(__sub__)的算术运算,减法(__sub__)的算术运算调用加法(__add__)的算术运算 class New_Init(i ...

  7. tp剩余未验证内容

    new Image(宽度,高度) $(image).attr('src', ...).load(function(){....}) load表示浏览器从服务器下载(装载)对象完成, 这个load方法很 ...

  8. 抠图|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)

    样例输入: 3 4 5 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0 0 1 5 6 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 ...

  9. C# 控件线程匿名委托定义

    当你在子线程中要修改主线程某个控件的值时,有不想再去定义一个线程变量时,就可以直接使用线程匿名委托来实现. 主要是方便快捷 控件.BeginInvoke(new ThreadStart(delegat ...

  10. MPU6050可以读取ID值,温度值和原始数据值为零问题解决

    MPU6050可以读取ID值是0x68,但是读取到的原始数据为零(下面虚拟示波器图中温度值是36.529是单位转换公式中的值被打印出来了,实际值也是零).经论坛搜寻,发现MPU6050出现问题的原因有 ...