博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Assembly类
阅读量:6083 次
发布时间:2019-06-20

本文共 2729 字,大约阅读时间需要 9 分钟。

  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();        }

 

 

 

 

 

 

 

 

转载地址:http://lckwa.baihongyu.com/

你可能感兴趣的文章
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>
水平添加滚动条
查看>>