(转)C# Assembly.Load 使用

(转)C# Assembly.Load 使用在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:System.Reflection命名空间(1)AppDoma

大家好,又见面了,我是你们的朋友全栈君。

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

[csharp] 
view plain
copy

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

  由于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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154704.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • [分享]Ubuntu12.04安装基础教程(图文)

    [分享]Ubuntu12.04安装基础教程(图文)

  • win10黑群晖安装教程_黑群晖7.0安装教程

    win10黑群晖安装教程_黑群晖7.0安装教程使用芯片无忧工具,查看U盘的和。使用,格式化U盘。使用镜像写入工具,把引导写入U盘。修改文件,可以使用工具把文件复制到桌面,通过修改好之后,拖进这个界面中。或者在电脑中,查看U盘,打开U盘中的文件直接修改。具体修改内容如下:,因为我的主板上有4个sata口,然后PCIE扩展了6个SATA口,所以这里写了46,分别对应主板的SATA数目和PCIE的SATA数目。,因为主板的4个SATA口分别为00、01、02、03,所以PCIE的SATA从04开始。也就是说,前面两个00代表主板上的SATA控制从00开始计数

    2022年10月31日
  • top命令 详解_top命令的用法

    top命令 详解_top命令的用法top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.1...

  • 返回顶部的五种实现方法

    返回顶部的五种实现方法【1】使用默认链接锚点添加一个a链接,设置a链接的href属性值为"#top"即可实现<div>我在顶部</div><!–很多内容–&g

  • Openstack 二次开发之:在windows 环境下编译Openstack-java-sdk

    Openstack 二次开发之:在windows 环境下编译Openstack-java-sdk

  • docker端口映射成功 不可用_docker启动后访问拒绝连接

    docker端口映射成功 不可用_docker启动后访问拒绝连接情境描述创建一个docker容器,并进行端口映射。容器启动后,在部署容器的主机上可以访问映射端口,但是其他主机无法访问。问题排查出现上述情况,应是请求被拦截。出现该问题的可能是由于firewall配置异常、ip转发关闭、iptables服务拦截了请求排查firewall(1)使用firewall-cmd–state查看防火墙运行情况如果防火墙处于notrunning,则可以排除…

    2022年10月17日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号