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方法。