System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到。

  由于这个类实在有太多的字段、属性与方法。实在不想将一个个属性方法从MSDN复制出来然后逐个属性、方法敲一次,我想改变一下学习方法,从实际运用学习。

一、加载程序集并执行方法

  使用反射加载程序集并执行方法,加载程序集主要使用LoadFrom()方法。

    static void Main(string[] args)
{
Assembly ass = Assembly.LoadFrom(@"D:\test.dll");
Type type = ass.GetType("Test.Add"); //注意要输入全部路径,包括命名空间
object obj = Activator.CreateInstance(type);
MethodInfo Add = type.GetMethod("AddCalculate"); //根据方法名获取MethodInfo对象
int i = (int)Add.Invoke(obj, new object[2] { 1, 2 });
Console.WriteLine(i); Console.ReadKey();
}

  以上程序运行输出3。

  注意在Assembly里面的加载程序集有3个方法,分别是Load、LoadFrom和LoadFile。这3个方法有什么异同呢?

  1. 如果你引用了命名空间,那么就直接Load()方法,参数里面写上命名空间+类名就可以加载了。
  2. 如果仅仅知道一个dll文件的那么就要用LoadFrom()方法了,参数里面直接填写完整的路径。

  LoadFrom 方法具有以下缺点。请考虑改用 Load。

  • 如果已加载一个具有相同标识的程序集,则即使指定了不同的路径,LoadFrom 仍返回已加载的程序集。
  • 如果用 LoadFrom 加载一个程序集,随后加载上下文中的一个程序集尝试加载具有相同显示名称的程序集,则加载尝试将失败。对程序集进行反序列化时,可能发生这种情况。

  总结: LoadFrom只能用于加载不同标识的程序集, 也就是唯一的程序集, 不能用于加载标识相同但路径不同的程序集。

  3.LoadFile 加载指定路径上的程序集文件的内容。

  这个方法是从指定的文件来加载程序集,它是调用外部的API实现的加载方式,和上面Load,LoadFrom方法的不同之处是这个方法不会加载此程序集引用的其他程序集,也就是不会加载程序的依赖项。而同时也是不能加载相同标识的程序集的。

  4.GetExecutingAssembly获取当前正在执行的程序集。

  示例:

        static void Main(string[] args)
{
//需引用命名空间
Assembly assm = Assembly.Load("fanshe");
Console.WriteLine(assm.FullName); //输出 fanshe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null //依靠路径
Assembly assm1 = Assembly.LoadFrom(@"D:\fanshe.dll");
Console.WriteLine(assm1.FullName); ////输出 fanshe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null //与Assembly.LoadFrom基本一样,只是如果被加载的dll,还依赖其他的dll的话,被依赖的对象不会加载
Assembly assm2 = Assembly.LoadFile(@"D:\fanshe.dll");
Console.WriteLine(assm2.FullName); //当前正在执行的程序集
Assembly assm3 = Assembly.GetExecutingAssembly();
Console.WriteLine(assm3.FullName); Console.ReadKey();
}

  

二、读取程序集中嵌入的资源

  读取嵌入的资源,主要有如下两个方法:

  1. GetManifestResourceNames:读取嵌入的资源名称。
  2. GetManifestResourceStream:读取嵌入的资源为流。
        static void Main(string[] args)
{
Assembly ass = Assembly.LoadFrom(@"D:\test.dll");
string[] names = ass.GetManifestResourceNames();
foreach (string name in names)
{
Console.WriteLine("所有的嵌入资源名:" + name);
} Stream myStream = ass.GetManifestResourceStream("Test.1.txt");
Console.WriteLine();
using (StreamReader sr = new StreamReader(myStream, Encoding.Default))
{
//嵌入的资源1.txt的内容
Console.WriteLine("嵌入的资源1.txt的内容:" + sr.ReadToEnd());
} Console.ReadKey();
}

C# Assembly类_反射的更多相关文章

  1. luogg_java学习_10_异常_反射

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 异常_反射 异常 异常就是导致程序中断执行的一段指令流 ...

  2. JavaSE学习总结第27天_反射 & 设计模式 & JDK5、7、8新特性

      27.01  反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读 ...

  3. C#工具:反射帮助类 泛型反射帮助类

    反射帮助类 using System; using System.Reflection; using System.Data; using System.Drawing; using System.R ...

  4. Assembly类

    System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到. 由于这个类实在有太多的字段.属性与方法.实在不想将一个个属性方法从MSDN复制出来然后逐个属性.方法敲 ...

  5. ado.net 实体类_数据访问类

    实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  6. SQLHelper帮助类_下(支持多数据库的封装)

    在上篇关于SQLHelper类中,主要针对SQLServer数据库进行的.在使用别的数据库,就要修改部分代码!所以今天就写一个支持多数据库的封装!主要用到枚举,读取config文件!接口的简单用法.获 ...

  7. JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践

    JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识 ...

  8. 类的反射及xml文件的解析

    类的反射 xml文件的解析 .properties||.xml配置文件的创建及读取内容 //创建对象 Properties properties = new Properties(); //存储 pr ...

  9. 类的反射_reflex

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为j ...

随机推荐

  1. haporxy 负载elasticsearch

    <pre name="code" class="html">-bash-4.1# cat /etc/haproxy/haproxy.cfg glob ...

  2. ActionResult解析

    原文地址:http://blog.csdn.net/gulijiang2008/article/details/7642213 ActionResult是一个抽象类, 在Action中返回的都是其派生 ...

  3. makefile例子《一》

    一.例子 (1)makefile和src源文件不在同一目录下 (2)把.o生成到指定目录下 文件结构目录 ----inc      //放头文件 ----lib //放所需要的.a或者.so文件 -- ...

  4. Linux shell编程02 shell程序的执行 及文件权限

    第一个shell脚本 1.       shell编程的方式 交互式shell编程 非交互式shell编程:执行的语句存放到一个文件 shell脚本:可以任意文件名,建议扩展名为sh 2.       ...

  5. javascript 我是广告

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equ ...

  6. 机房收费系统中的Grid++Report报表设计器的应用

    在进行账单查询功能的时候我应用了Grid++Report报表设计器,下面我就为大家介绍一下,还望大家多多指点. 首先,在Grid++Report报表设计器中进行报表界面的设置.在属性编辑窗口中这里对报 ...

  7. [HTML5] Level up -- Display

    HTML5 Input type: Traditionally presentational tags, the i, b, em, and strong tags have been given n ...

  8. linux重命名

    mv  A  B 将目录A重命名为B mv  /a  /b /c   将目录/a目录移动到/b下并重命名为c 其实在文本模式中要重命名文件或目录的话也是很简单的,我们只需要使用mv命令就可以了,比如说 ...

  9. HTML 表格入门

    每个表格都是由 table 标签开始. 每个表格行由 tr 标签开始. 每个表格数据由 td 标签开始. 这样是一行三列: <table border="1"> < ...

  10. Func 委托 和 Action 委托 初步谈论

    继上篇EventHandler之后,继续填坑,简单了解下Func<TResult> 委托 和 Action 委托. msdn对于两者的解释: Func<TResult>:封装一 ...