.NET 动态加载程序集(二)

正式开始本文:在 .NET 框架中,将程序集加载至应用程序域的方法有几种。每种方法使用不同的类。

您可以使用下面的重载方法将程序集加载至应用程序域:

System.AppDomain 类包含几种重载的 Load 方法。尽管这些方法可用于将任何程序集成功地加载至当前的或新的应用程序域,但它们主要还是用于 COM 交互操作。您也可以使用 CreateInstance 方法加载程序集。

System.Reflection.Assembly 类包含两种静态重载方法:Load 和 LoadFrom。这两种方法因加载上下文而异。

简单例题:讲解了在一个.exe文件中调用另一个.exe文件的方法

using System;

namespace dy_loadAsse

{

     class testclass

     {

          [STAThread]

         static void Main(string[] args)

         {

              OutUse test=new OutUse();

               test.Output();

              Console.ReadLine();

         }

        

     }

     class OutUse

     {

         public  OutUse()

         {

         }

         public void Output()

         {

              Console.WriteLine("test dy load assembly");

         }

     }

}

以上编译成功。为dy_loadAsse.exe,执行显示:

test dy load assembly

放在与下面生成的loadexe.exe于同一目录下。

文件二:

using System;

using System.Reflection;

namespace Use_dy_Load_Assembly

{

     class LoadExe

     {

          [STAThread]

         static void Main(string[] args)

         {

              // Use the file name to load the assembly into the current application domain.

              Assembly a = Assembly.LoadFrom("dy_loadAsse.exe");

              Type [] types2 = a.GetTypes();

              foreach (Type t in types2)

              {

                   Console.WriteLine (t.FullName);

              }

              //Get the type to use.

              //Type myType = a.GetType("OutUse"); 这样写老是出错

              Type myType = a.GetType("dy_loadAsse.OutUse");

             Console.WriteLine (myType.FullName);

              //Get the method to call.

              MethodInfo mymethod = myType.GetMethod("Output");

//            //Create an instance.

            Object obj = Activator.CreateInstance(myType);

//            //Execute the adnamemethod method.

            mymethod.Invoke(obj,null);

              //执行结果为test dy load assembly

              //以下是调用dy_loadAsse.exe中的Main方法,出现错误

//                     Type myType = a.GetType("dy_loadAsse.testclass");

//                    Console.WriteLine (myType.FullName);

//                     //Get the method to call.

//                    MethodInfo mymethod = myType.GetMethod("Main");

//            ////          //Create an instance.

//                        Object obj = Activator.CreateInstance(myType);

//            ////          //Execute the adnamemethod method.

//                         mymethod.Invoke(obj,null);    

              Console.ReadLine();

         }

     }

}

实际上不管你是.exe或dll 组成的程序集  都可以被加载

自定义绑定

除了由编译器隐式地用来进行晚期绑定之外(指virtual方法,接口等相关实现的绑定),反射还可以在代码中显式地用来完成晚期绑定。 公共语言运行库支持多种编程语言,但这些语言的绑定规则各不相同。在早期绑定的情况下,代码生成器可以完全控制此绑定。但是,当通过反射进行晚期绑定时,必须用自定义绑定来控制绑定。Binder 类提供了对成员选择和调用的自定义控制。

利用自定义绑定,您可以在运行时加载程序集,获取有关该程序集中类型的信息,然后对该类型调用方法或访问该类型的字段或属性。如果您在编译时(例如当对象类型依赖于用户输入时)不知道对象的类型,就可以使用这种方法。

using System;

namespace dy_loaddll

{

    

     public class HelloWorld

     {

         // Constant Hello World string.

          private const String m_helloWorld = "Hello World";

         // Default public constructor.

         public HelloWorld()

         {

         }

         // Print "Hello World" plus the passed text.

         public void PrintHello(String txt)

         {

              // Output to the Console.

              Console.WriteLine(m_helloWorld + " " + txt);

         }

     }

}

编辑生成dy_loaddll.dll,与 LoadExe.exe在同一的目录下面。

using System;

using System.Reflection;

namespace Use_dy_Load_Assembly

{

     class LoadExe

     {

          [STAThread]

         static void Main(string[] args)

         {

              // Use the file name to load the assembly into the current application domain.

              Assembly a = Assembly.LoadFrom("dy_loaddll.dll");

              Type [] types2 = a.GetTypes();

              foreach (Type t in types2)

              {

                   Console.WriteLine (t.FullName);

              }

              //Get the type to use.

//            Type myType = a.GetType(""); 这样写老是出错因为上面的dll加了命名空间

                       Type myType = a.GetType("dy_loaddll.HelloWorld");

                      //   Type myType = a.GetType("HelloWorld");

                            Console.WriteLine (myType.FullName);

//                          //Get the method to call.

              MethodInfo printMethod = myType.GetMethod("PrintHello");

              // Create an instance of the HelloWorld class.

              Object obj = Activator.CreateInstance(myType);

              // Create the args array.

              Object[] test = new Object[1];

              // Set the arguments.

              test[0] = "From CSharp Late Bound";

              // Invoke the PrintHello method.

              printMethod.Invoke(obj, test);  

              Console.ReadLine();

         }

     }

}

当然我们不禁要问题,如果方法重载,如果是属性。又该怎么办??

/查相关的msdn,

ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpcondynamicallyloadingusingtypes.htm#cpcondynamicallyloadingusingtypes

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTypeClassInvokeMemberTopic.htm

 
 
 

时间: 2024-08-27 15:12:02

.NET 动态加载程序集(二)的相关文章

.NET 动态加载程序集 (三)

我们先看看一般的反射的动态方法查找 下面为ms自带的例子ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemreflectionmethodbaseclassinvoketopic.htm public class A {    public virtual int method () {return 0;} } public class B {    public virtual int method () {return 1;} }

WPF动态加载程序集

问题描述 WPF动态加载的程序集如果是窗体可以直接运行:假如把运行的窗体关闭后,它在AppDomain中还是存在的,那么下次加载的时候就可以根据名称直接打开运行:我想知道的是怎么防止程序集同时运行多次?(就是防止同一个窗体打开多次,在AppDomain中如何防止)PS:不要说什么模态窗体 解决方案 解决方案二:单例解决方案三:一般都是运行之前遍历已经存在的进程这种方法很不靠谱,强烈要求微软从底层实现这个功能解决方案四:在Application.Current.Windows中判断窗体名称,如果存

android-如何动态加载布局控件

问题描述 如何动态加载布局控件 通过解析json,然后通过case判断加载不同的控件,如何该实现呢,求大神帮助 解决方案 使用惰性控件ViewStub实现布局动态加载使用惰性控件ViewStub实现布局动态加载使用惰性控件ViewStub实现布局动态加载---------------------- 解决方案二: jsonobject解析后,判断呗,然后就该创建啥就创建啥,可以利用反射,把创建什么也可以放到json里 解决方案三: 这个~~我也在问同样的问题 解决方案四: 这个~~我也在问同样的问

java如何动态加载.java文件

问题描述 java如何动态加载.java文件 运行的web工程(tomcat容器),java如何动态加载.java文件! 解决方案 Java 动态加载Java 动态加载JAVA 动态加载 解决方案二: java文件最终会转化成class文件,加载java文件还是要重新部署tomcat 解决方案三: 不晓得你的意思,你的意思是tomcat容器启动的时候,指定运行某个类? 解决方案四: 如果楼主只是觉得tomcat在调试的时候修改了内容需要重新部署很麻烦,楼主可以通过双击tomcat服务,然后修改P

Visual Basic .NET 中动态加载类 (二)

visual|动态|加载 Microsoft 步骤 3:创建配置文件以存放可用窗体 应用程序在运行时需要的某些信息可能在编译时无法提供,这些信息通常放置在配置文件中.在 Visual Basic 6.0 中,配置文件应该是 INI 文件或 Windows 注册表.而在 .NET 中,则使用基于 XML 的配置文件. 我们无法详细介绍配置文件,因为这个主题非常复杂.但是,您应该知道,Windows 窗体应用程序的配置文件与应用程序的 EXE 启动文件在同一个目录中.配置文件的名称与程序的 EXE

c# 动态加载和卸载C#DLL程序集 C++程序集,

c# 动态加载和卸载C#DLL程序集的原文链接是: http://www.cnblogs.com/MiracleLee/archive/2013/01/31/2886323.html 做一个开源项目地址是: 点击打开链接

jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法_jquery

在上篇文章给大家介绍了jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单 先上代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title&g

Android 动态加载二维码视图生成快照的示例

1.需求背景 需要实现一个动态加载但不显示出来的视图,且该视图上有个动态生成的二维码,最后用其去生成一张快照(也就是图片). (常见这种情况是来源于"图片分享"的功能需求,与普通图片分享不同在于,该快照图片是动态加载不显示的.) 2.需求功能拆解 动态二维码的实现 动态视图生成快照的实现 3.踩坑点提要 获取不到动态视图的bitmap 无法获取最新动态视图的bitmap 4.开发实现 动态加载的视图的布局文件代码: <?xml version="1.0" en

js的动态加载、缓存、更新以及复用(二)

上一篇发出来后得到了很多回复,在此首先感谢大家的热情捧场!有的推荐第三方框架,比如 In.js.requrieJS.sea.js.lab.js等.这个开阔了眼界,以前只知道sea.js,省去了自己搜索的麻烦.也用了点时间简单看了一下,因为每一个都是大块头,都有自己的理念,如果只是简单使用的话,那么谁便找一个就可以了,但是我习惯把原理弄清楚.因为我觉得虽然不知道原理也可以使用,但是知道了原理后,可以用的更好. 主要看的是sea.js,目前简单的理解是:一个加载js的机制 + 模块化编程(CMD规范