反射Demo:

  1. public class Person
  2. {
  3. public int Age;
  4.  
  5. public void SayHello()
  6. {
  7. Console.WriteLine("Hello Person");
  8. }
  9. }
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //把程序集像读取文件一样读取出来,动态的调用程序集里面的方法
  6. Person p = new Person();
  7. /*
  8. * 使用Type描述类型特征
  9. Type t1=typeof(ClassName);
  10. Type t2=ClassName.GetType();
  11.  
  12. t1.GetEvents/t1.GetFields/
  13. t1.GetMembers
  14. t1.GetMethods() //返回所有公共方法
  15. */
  16. Type t1 = typeof(Person);
  17. Type t2 = p.GetType();
  18.  
  19. //GetEvents 获取所有的事件
  20. EventInfo[] events = t1.GetEvents();
  21. foreach (var item in events)
  22. {
  23. Console.WriteLine("Event: " + item.Name);
  24. }
  25. //GetFields 获取所有的public字段
  26. FieldInfo[] fields = t1.GetFields();
  27. foreach (var item in fields)
  28. {
  29. Console.WriteLine("Fields: " + item.Name);
  30. }
  31. //GetMethods 获取所有的方法
  32. MethodInfo[] methods = t1.GetMethods();
  33. foreach (var item in methods)
  34. {
  35. Console.WriteLine("Method: " + item.Name);
  36. }
  37. Console.ReadKey();
  38. }
  39. }

反射:【从文件中读取程序集中的成员,并使用它】

->实现步骤:

->使用Assembly.LoadFrom(文件名全名)  【获得程序集对象Assembly】

->使用GetTypes()获得所有的类型信息(Type对象) 【读取类型 GetType】

->Activator.CreateInstance(Type类型的数据)创建指定类型的对象  【创建对象 Activator.CreateInstance】//实例.方法()

->如果需要调用方法,使用<type>.GetMethod(方法名)获得MethodInfo类型对象 【获得方法 <type>.GetMethod】

->调用 方法对象.Innvoke(实例,参数);

//DrHao 类库

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace DrHao
  8. {
  9. public class Hao
  10. {
  11. public void Fun1()
  12. {
  13. Console.WriteLine("我是没有参数的Fun1");
  14. }
  15.  
  16. public void Fun1(int num1)
  17. {
  18. Console.WriteLine("参数是:" + num1);
  19. }
  20.  
  21. public int Fun1(int num1, int num2)
  22. {
  23. return num1 + num2;
  24. }
  25.  
  26. private void Func()
  27. {
  28. Console.WriteLine("无参数的私有方法");
  29. }
  30. }
  31. }

//Main函数

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //把程序集像读取文件一样读取出来,动态的调用程序集里面的方法
  6.  
  7. //反射
  8. //读取程序集
  9. Assembly asm = Assembly.LoadFrom(@"E:\Program2013\20160416_Reflect\DrHao\bin\Debug\DrHao.dll");
  10. //读取类型
  11. Type t = asm.GetType("DrHao.Hao");
  12. //创建对象信息
  13. object o = Activator.CreateInstance(t);
  14. //获得方法
  15. ////私有方法
  16. //MethodInfo method = t.GetMethod("Func", BindingFlags.Instance|BindingFlags.NonPublic);
  17.  
  18. MethodInfo method = t.GetMethod("Fun1", new Type[] { typeof(int), typeof(int) });
  19.  
  20. object result = method.Invoke(o, new object[] { , });
  21. Console.WriteLine("|{0}|", result);
  22. Console.ReadKey();
  23. }
  24. }

关于.NET中的反射,常用的有三个方法:

Assembly.Load()

Assembly.LoadFrom()

Assembly.LoadFile()

1. Assembly.Load() 

Load()方法接收一个String或AssemblyName类型作为参数,这个参数实际上是需要加载的程序集的强名称(名称,版本,语言,公钥标记)。

例如.NET 2.0中的FileIOPermission类,它的强名称是:

System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

对于弱命名的程序集,则只会有程序集名称,而不会有版本,语言和公钥标记。如 TestClassLibrary

2. Assembly.LoadFrom()

LoadFrom()方法可以从指定文件中加载程序集,通过查找程序集的AssemblyRef元数据表,得知所有引用和需要的程序集,然后在内部调用Load()方法进行加载

Assembly.LoadFrom(@"C:\ABC\Test.dll");

3. Assembly.LoadFile()

LoadFile()从一个指定文件中加载程序集,它和LoadFrom()的不同之处在于LoadFile()不会加载目标程序集所引用和依赖的其他程序集

您需要自己控制并显示加载所有依赖的程序集

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

1:Assembly.Load()

这个方法通过程序集的长名称(包括程序集名,版本信息,语言文化,公钥标记)来加载程序集的,会加载此程序集引用的其他程序集,

一般情况下都应该优先使用 这个方法,他的执行效率比LoadFrom要高很多,而且不会造成重复加载的问题(原因在第2点上说明)

使用这个方法的时候, CLR会应用一定的策略来查找程序集,实际上CLR按如下的顺序来定位程序集:

⑴如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。

⑵如果程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件中的<codebase>元素指定的URL来查找

⑶如果没有指定强名称或是在GAC中找不到,CLR会探测特定的文件夹:

假设你的应用程序目录是C:\AppDir,<probing>元素中的privatePath指定了一个路径Path1,你要定位的程序集是AssemblyName.dll则CLR将按照如下顺序定位程序集

  C:\AppDir\AssemblyName.dll

  C:\AppDir\AssemblyName\AssemblyName.dll

  C:\AppDir\Path1\AssemblyName.dll

  C:\AppDir\Path1\AssemblyName\AssemblyName.dll

如果以上方法不能找到程序集,会发生编译错误,如果是动态加载程序集,会在运行时抛出异常!

2:Assembly.LoadFrom()

这个方法从指定的路径来加载程序集,实际上这个方法被调用的时候,CLR会打开这个文件,获取其中的程序集版本,语言文化,公钥标记等信息,把他们传递给 Load方法,

接着,Load方法采用上面的策略来查找程序集。如果找到了程序集,会和LoadFrom方法中指定的路径做比较,如果路径相同,该程序集会被认为是应用程序的一部分,

如果路径不同或Load方法没有找到程序集,那该程序集只是被作为一个“数据文件”来加载,不会被认为是应用程序的一部分。

这就是在第1点中提到的Load方法比LoadFrom方法的执行效率高的原因。

另外,由于可能把程序集作为“数据文件”来加载,所以使用 LoadFrom从不同路径加载相同程序集的时候会导致重复加载。当然这个方法会加载此程序集引用的其他程序集。

3:Assembly.LoadFile()

这个方法是从指定的文件来加载程序集,和上面方法的不同之处是这个方法不会加载此程序集引用的其他程序集!

结论:一般大家应该优先选择Load方法来加载程序集,如果遇到需要使用LoadFrom方法的时候,最好改变设计而用Load方法来代替!

另:Assembly.LoadFile 与 Assembly.LoadFrom的区别

1、Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("abc.dll"),则载入abc.dll,假如abc.dll中引用了def.dll的话,def.dll并不会被载入。

Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,def.dll也会被载入。

2、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如abc.dll有两个版本(版本1在目录1下,版本2放在目录2下),

程序一开始时载入了版本1,当使用Assembly.LoadFrom("2\\abc.dll")载入版本2时,不能载入,而是返回版本1。

Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2。

LoadFile:加载指定路径上的程序集文件的内容。LoadFrom: 根据程序集的文件名加载程序集文件的内容。

区别:

LoadFile 方法用来来加载和检查具有相同标识但位于不同路径中的程序集.但不会加载程序的依赖项。

LoadFrom 不能用于加载标识相同但路径不同的程序集。

参考资料:http://www.cnblogs.com/zagelover/articles/2726034.html

C#反射-Assembly.Load、LoadFrom与LoadFile的更多相关文章

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

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

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

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

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

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

  4. (转)C# Assembly.Load 使用

    在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System.Reflection命名空间(1)  AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器(2)  As ...

  5. Assembly中Load, LoadFrom, LoadFile以及AppDomain, Activator类中相应函数的区别

    Assembly和AppDomain的一些关于动态加载程序集的函数有些令人头疼,但细细研究后还是可以将他们区分的. 这些函数大致可以分为四类: 第一类:加载到Load Context内 Load Co ...

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

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

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

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

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

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

  9. C#反射Assembly 详细说明

    1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...

随机推荐

  1. MicrosoftFixit50688 [Windows7事件ID10,WMI错误的解决方法

     Windows7事件记录中有如下错误提示: "Event filter with query "SELECT * FROM __InstanceModificationEve ...

  2. [转帖]awk 入门

    awk其实不仅仅是工具软件,还是一种编程语言.不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了. http://www.ruanyifeng.com/blog/2018/11/awk.ht ...

  3. [OS] Linux进程、线程通信方式总结

    转自:http://blog.sina.com.cn/s/blog_64b9c6850100ub80.html Linux系统中的进程通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程 ...

  4. python selenium判断元素是否存在的问题

    爬虫的时候经常用到这个,找到了一个比较好用的方法 原文链接:http://blog.csdn.net/u012189659/article/details/36391837 背景:selenium+p ...

  5. [BZOJ4556][Tjoi2016&Heoi2016]字符串 后缀数组+主席树

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MB Description 佳媛姐姐过生日的时候,她的小 ...

  6. 学习Spring Boot:(六) 集成Swagger2

    前言 Swagger是用来描述和文档化RESTful API的一个项目.Swagger Spec是一套规范,定义了该如何去描述一个RESTful API.类似的项目还有RAML.API Bluepri ...

  7. Ubuntu中Android SDK Manager无法更新解决办法

    Ubuntu中Android SDK Manager无法更新解决办法http://hi.baidu.com/petercao2008/item/d7a64441f04668e81e19bc1a

  8. @Html.DropDownListFor默认选中项

    http://q.cnblogs.com/q/73902/ 项目使用mvc4,给dropDownList指定默认值未选中 页面代码是: 1.未有默认选中值 Html.DropDownListFor(m ...

  9. Java虚拟机性能监控与调优

    1 基于JDK命令行工具的监控 1.1 JVM的参数类型 1.1.1 标准参数 在JVM的各个版本基本上保持不变,很稳定的. -help -server -client -version -showv ...

  10. mongodb 使用 robo3T 等工具添加用户之后还是 auth failed 的问题

    命令行输入 mongo use 对应的 db(需要授权的数据库),如 use admin 使用命令创建一个数据库,并赋予权限: db.createUser( { user: "xxx&quo ...