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