天天看點

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

  看了一段時間的#develop,首先接觸到的就是程式的插件架構。園子裡也有許多不錯的資料可以學習。随時把自己的認識寫下來和大家交流,無疑會有很大幫助。閑話就不說了,進入正題。

     說到插件架構,首先要有一個整體印象,到底什麼才是插件架構?這個問題的答案很好找,找個插件架構的程式看看就可以了,比如VS,MyIE,再比如千千靜聽。我們可以開發不同功能的插件,加載到宿主程式上,功能就能發揮作用。宿主程式呢,完全不知道我們到底什麼樣的功能,怎麼實作的。這裡呢,我想從我們平常寫程式時引用一些類庫說起。我們經常會把一些功能封裝到一個dll中,然後在其他項目中引用,引用時,直接調用其中的方法就ok了。Dll是編譯過的,方法名是我們自己知道的,無論是自己寫的dll,還是引用别人的,總之,我們一定知道我們調用的什麼方法。試想一下,如果我們加一個約定,約定了這個dll中的方法名,那這個時候,這個dll的客戶程式是不是不用管是什麼dll,隻要調用約定的方法就可以了?那再想一下,這個dll非得引用嗎?動态加載行不行?當然行,加載之後,去調用約定的方法,完全可以。到這裡,我們發現,其實隻要一個約定,客戶程式完全不需要去在意它的服務者是什麼樣的狀态,exe也好dll也好,隻要能提供契約裡的方法就ok了,它隻關心有沒有這麼一個方法可以調用。至此,發現這不就是最最簡單的一個插件架構的樣子嗎?

    接下來,趕緊動手寫個例子試一下:

    首先,定義一個契約,這裡采用了接口,那最好再來一個實作該接口的抽象類,如下

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

    public interface IPlugIn

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

    {

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        //往控制台上列印東西,這裡可以寫任何你想要的契約行為

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        void PrintToConsole();

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

    }

    接下來,寫宿主程式,宿主程式肯定要先加載實作了IPlugIn的插件,然後調用其約定的方法。在.Net裡無非就是反射一下就ok了,看代碼:

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

 static void Main(string[] args)

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        {

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            List<IPlugIn> PlugIns = LoadPlugIn();

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            if (PlugIns != null)

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            {

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                foreach (IPlugIn p in PlugIns)

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                {

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                    p.PrintToConsole();

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                }

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            }

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            Console.ReadLine();      

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        }

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        /// <summary>

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        /// 加載插件

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        /// </summary>

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        /// <returns>傳回可用插件的清單</returns>

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        private static List<IPlugIn> LoadPlugIn()

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            List<IPlugIn> Plugs = new List<IPlugIn>();

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            Assembly a = null;

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            try

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

               a = Assembly.LoadFile(Console.ReadLine());

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            catch 

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                Console.WriteLine("File not found!");

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                return null;

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            System.Type[] types = a.GetTypes();

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            foreach (System.Type type in types)

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                //校驗加載的dll是否實作了契約,當然此處也可以用Attribute來實作

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                if (type.GetInterface("IPlugIn") != null)

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

                    Plugs.Add((IPlugIn)Activator.CreateInstance(type));

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            return Plugs;

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

    下一步,該完成插件了,實作那個接口而已嘛,簡單

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        //實作了contract裡約定的方法,控制台上輸出"Hello world"字元串

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

        public void PrintToConsole()

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

            Console.WriteLine("Hello world!");

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

    測試一下,為了友善,我把插件dll copy到G盤根目錄下(可以少打幾個字母哦),運作宿主程式,輸入該dll路徑,看到了我們預期的hello world

插件架構學習體會(一) -- 宿主程式說:插件你得聽我的
插件架構學習體會(一) -- 宿主程式說:插件你得聽我的

    園子裡相關資源推薦:

繼續閱讀