天天看點

建構插件式的應用程式架構(三)-動态加載

不管你采用什麼方式實作插件式的應用程式架構,核心還是動态加載,換句話說,沒有動态加載技術也就無所謂插件式的應用程式架構了。使用Com實作的話,你可以利用Com的API通過ProgID來動态建立COM對象,如果使用普通DLL,你需要使用Windows 的API函數LoadLibrary來動态加載DLL,并用GetProcAddress函數來擷取函數的位址。而使用.NET技術的話,你需要使用Assembly類的幾個靜态的Load(Load,LoadFile,LoadFrom)方法來動态加載彙集。

一個Assembly裡可以包含多個類型,由此可知,一個Assembly裡也可以包含多個插件,就像前一篇文章所講,隻要它從IPlugin接口派生出來的類型,我們就承認它是一個插件類型。那麼Assembly被動态加載了以後,我們如何擷取Assembly裡包含的插件執行個體呢?這就要用到反射(Reflection)機制了。我們需要使用Assembly的GetTypes靜态方法來得到Assembly裡所包含的所有的類型,然後周遊所有的類型并判斷每一個類型是不是從IPlugin接口派生出來的,如果是,我們就使用Activator的靜态方法CreateInstance方法來獲得這個插件的執行個體。.NET的動态加載就是這幾個步驟。下來,我做一個簡單的例子來演練一下動态加載。首先聲明一點,這個例子非常簡單,純粹是為了演練動态加載,我們的真正的插件式的應用程式架構裡會有專門的PluginService來負責插件的加載,解除安裝。 

我們的插件位于一個DLL裡,是以我們首先建立一個Class library工程。建立一個FirstPlugin類讓它派生于IPlugin接口,并實作接口的方法和屬性,由于本文的目的是示範動态加載,是以IPlugin接口的Loading事件我們就不提供預設的實作了,雖然編譯的時候會給出一個警告,我們不必理會它。這個插件的功能就是在應用程式裡建立一個停靠在主窗體底部的ToolStrip,這個ToolStrip上有一個按鈕,點選這個按鈕,會彈出一個MessageBox顯示“The first plugin”。下面是代碼:

複制  儲存

接下來我們建立一個Windows Application工程讓主窗體派生于IApplication接口并實作IApplication接口的方法和屬性,下來我們聲明1個MenuStrip和1個StatusStrip,讓他們分别停靠在視窗的頂部和底端,接下來我們聲明4個ToolStripPanel,分别人他們停靠在上下左右四個邊,最後我們建立一個ToolStrip,在上邊添加一個按鈕,當點選這個按鈕的時候,我們動态的加載插件。

為了友善示範,我們把生成的Assembly放置到固定的位置,以友善主程式加載,在本例裡,我們在應用程式所在的檔案夾裡建立一個子檔案夾Plugins(E:"Practise"PluginSample"PluginSample"bin"Debug"Plugins),将插件工程産生的Assembly(FirstPlugin.dll)放置在這個子檔案夾。下面是動态加載的代碼:

我把完整源代碼也附上,友善大家使用:源代碼下載下傳

<a href="http://files.cnblogs.com/guanjinke/pluginsample.rar">http://files.cnblogs.com/guanjinke/pluginsample.rar</a>

繼續閱讀