zoukankan      html  css  js  c++  java
  • C#动态加载程序集(转)

    C#动态加载程序集

            今天在看网络上的一篇关于‘.NET应用自动部署窗体技术’。NET的自动部署技术构造在.NET框架之中,它使得应用程序能够通过HTTP连接从远程服 务器按需下载程序集。有了这个功能,我们可以把胖客户端应用程序发布到一个Web服务器,确保用户下一次使用应用程序时总是自动得到程序的最新版本。设想 一下吧:再也不必用CD来发布升级软件,再也不必在电话中向用户反复解释因版本冲突引起的问题!

            其中,就需要动态加载程序集,利用“滴流”部署(Tickle Down Deployment),保证客户端始终使用最新的程序。下面是我程序部分,后面再做代码分析:
    新建一个控制台应用程序,并创建下面一个类

    //类Employer
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;

    namespace AssemblyAuto
    {
        public class Employer
        {

            //利用.NET属性,加载外部dll及其方法
            [DllImport("User32.dll")]
            public static extern int MessageBox(int hParent, string Message, string Caption, int Type);

            public void Show()
            {
                MessageBox(0, "Hello", "Message", 0);
            }
        }
    }

    //主程序中引用
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;

    namespace AssemblyAuto
    {
        class Program
        {
            static void Main(string[] args)
            {
                //由于是本地开发,所以取自磁盘物理路径,部署后,可以取URL虚拟路径
                string URL = @"H:IntNetMyFirstProgramAssemblyAutoEmployer.dll";
                try
                {
                    Assembly a = Assembly.LoadFrom(URL);
                    Type t = a.GetType("AssemblyAuto.Employer");
                    Object o = Activator.CreateInstance(t);
                    MethodInfo Method = t.GetMethod("Show");
                    Object[] par = new Object[] { };

                    //利用反射,动态调用方法
                    Method.Invoke(o, par);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message.ToString());
                }

                Console.ReadKey();
            }
        }
    }

    //编译程序集和应用程序命令(具体命令在另外篇文章中有详细说明
    >csc /target:library Employer.cs
    >csc /out:Program.exe Program.cs


           首先,Assembly.LoadFrom利用HTTP协议下载一个DLL。在本例中,URL指向本地物理路径,但它同样也可以指向一个远程服务器,例如 这就是说,我们只要一行代码,并指定一个适当的URL,其余工作就全交给.NET了,不管程序集是本地的还是远程的。

      其次,从远程服务器下载得到一个DLL之后,GetType这行代码从该DLL提取一个类的引用。注意,类的名称以字符串的形式指定,这意味着,我们 可以在运行时临时决定要引用的类的名称。这一点非常重要,因为现在我们可以在运行时决定要引用的是AssemblyAuto.Employer,还是其他 类。对于VB.NET和C#之类强类型的语言,这一特性显得尤其宝贵,它提供的灵活性是这类语言中非常罕见的。

      最后,Activator.CreateInstance()这行代码实际创建了Employer类的一个实例。有了类的实例之后,接下来就可以调用它的方法,设置它的属性。在上面的例子中,我们调用了Employer类的Show方法。

  • 相关阅读:
    hard example mining(困难样本挖掘)
    Docker
    cmake使用教程
    CFENet: An Accurate and Efficient Single-Shot Object Detector for Autonomous Driving
    Week1
    To-Read List
    《人性的弱点》读书笔记及读后感
    总结计划:2018:上半年——毕业前
    TCP网路程序设计
    Linux 串口驱动设计二
  • 原文地址:https://www.cnblogs.com/icedog/p/3330018.html
Copyright © 2011-2022 走看看