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:\IntNet\MyFirstProgram\AssemblyAuto\Employer.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方法。

 

 

posted @ 2013-09-19 22:09  icedog  阅读(1739)  评论(0编辑  收藏  举报