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

相關文章
相關標籤/搜索