C# 反射_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C# 反射

C# 反射

 2017/10/25 9:55:53  孤者自清  程序员俱乐部  我要评论(0)
  • 摘要:.net中常会用到动态加载DLL,而DLL中可能包含各种参数、方法、窗体,如何来调用动态加载这些参数、方法、窗体呢?在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:System.Reflection命名空间(1)AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器(2)Assembly:程序集类(3)Module:模块类(4)Type:使用反射得到类型信息的最核心的类他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly
  • 标签:C# 反射

.net中常会用到动态加载DLL,而DLL中可能包含各种参数、方法、窗体,如何来调用动态加载这些参数、方法、窗体呢?

 

在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:

System.Reflection命名空间

(1)   AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器

(2)   Assembly:程序集类

(3)   Module:模块类

(4)   Type:使用反射得到类型信息的最核心的类

他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.

 

 

在程序中,如果我们要动态加载一个程序集有以下种方式可以使用,分别是Load、LoadFrom、LoadFile、LoadWithPartialName方法.

其中着重讲解以下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: 根据程序集的文件名加载程序集文件的内容。

 

调用方法代码:

举例需要反射的DLL名称为WindowsFormsApplication2.dll,其中包含一个From1窗体和一个Class1类,类中有a,b两个方法,a方法需要传递一个Int类型的参数,返回结果为参数+1,b方法不需要传递参数,返回结果为1,两个方法都为静态方法

调用b方法,不需要传递参数:

            Assembly outerAsm = Assembly.LoadFrom(@"urPath\WindowsFormsApplication2.dll");

            Type type = outerAsm.GetType("WindowsFormsApplication2.Class1");//调用类型
            MethodInfo method = type.GetMethod("b");//调用方法

            //不需要传参数
            object obj = string.Empty;
            string value = method.Invoke(obj, null).ToString();  //value = 1

调用a方法,需要传递参数:

            Assembly outerAsm = Assembly.LoadFrom(@"urPath\WindowsFormsApplication2.dll");

            Type type = outerAsm.GetType("WindowsFormsApplication2.Class1");//调用类型
            MethodInfo method = type.GetMethod("a");//调用方法

            //如果需要传参数
            object[] paramertors = new object[] { 2016 };//参数集合
            string value = method.Invoke(null, paramertors).ToString();//Invoke调用方法 value=2017

调用窗体并加载出来:

Assembly outerAsm = Assembly.LoadFrom(@"urPath\WindowsFormsApplication2.dll");

            Type type = outerAsm.GetType("WindowsFormsApplication2.Class1");//调用类型
          
            //调用DLL中窗体
            Type outerForm = outerAsm.GetType("WindowsFormsApplication2.Form1", false);//找到指定窗口
            (Activator.CreateInstance(outerForm) as Form).Show();//转换成窗体类,显示

 

参考原文链接:http://www.cnblogs.com/mumupudding/p/4607400.html

 

发表评论
用户名: 匿名