在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. 病毒注册表常用目标Svchost和Explorer

    Windows系统的Svchost.exe和Explorer.exe两种进程,作为Windows系统中两种重要的进程,下面我们就来看看他们的特点以及在各个操作系统中的应用. Explorer.exe ...

  2. linux日常管理

    1.压缩和解压 tar压缩tar -czf hxl_product.tar.gz ./product tar解压tar -xzvf hxl_app.tar.gz z选项会将该压缩文件直接解压到目录,要 ...

  3. win-Linux文件脚本迁移过程中的问题 syntax error: unexpected end of file

    问题:  在win下写好的shell脚本,放到Linux上测试sh -n报错如下 ORA_check.sh: line 251: syntax error: unexpected end of fil ...

  4. python --- 03 整型 bool 字符串 for循环

    一.整型(int) 基本操作: 1.+ - * / % // ** 2.  .bit_length() 计算整数在内存中占⽤的⼆进制码的⻓度 如: 二.布尔值(bool) True  False 1. ...

  5. Oracle错误——SP2-0734: 未知的命令开头 "imp C##sin..." - 忽略了剩余的行。

    错误 在windows的DOS窗口下使用命令导入Oracle数据. 原因 进入sqlplus里是不能执行imp的(sqlplus不认识imp),imp 是个工具,应该在cmd的dos命令提示符下执行.

  6. Python3 tkinter基础 Canvas create_line 画实线与虚线

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. Vue学习【第四篇】:Vue 之webpack打包工具的使用

    什么是webpack webpack是一个模块打包工具.用vue项目来举例:浏览器它是只认识js,不认识vue的.而我们写的代码后缀大多是.vue的,在每个.vue文件中都可能html.js.css甚 ...

  8. 题解——P1108低价购买(DP)

    第一问是最长下降子序列,n很小,n^2可过,注意最长下降子序列的枚举顺序即可 ;i<=n;i++)//不要写错 ;j<i;j++)//不要打成<= ) b[i]=b[j]+; 第二问 ...

  9. 在Mac OSX下安装Microsoft Calibri字体

    参考: Where can I find default Microsoft fonts Calibri, Cambria? 在Mac OSX下安装Microsoft Calibri字体 1.下载: ...

  10. js旋转V字俄罗斯方块

    实现效果如图,也就是一个图像的旋转.注意,旋转后的文字是相对应的,而且文字还是立起的.第一次点击时显示,第二次点击时开始旋转.下面是我做这个效果的记录,方法这么差,我也就不说什么了. 先上HTML/C ...