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;spa
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;get
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[] { };string
//利用反射,动态调用方法
Method.Invoke(o, par);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}it
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方法。