從本質來講,OOP應用系統是由類型來構成的。在.NET,類由程式集來提供,一個應用系統由一堆的程式集組成,這些程式集有些是.NET Framework提供,有些是第三方提供,剩下的是自訂的程式集。基於OSGi.NET外掛程式架構來構建的應用系統,是由外掛程式來組成的,每一個外掛程式由屬於外掛程式的程式集和外掛程式資訊清單檔描述組成。本文將分成以下話題來描述:
● 使用工具,不需一行代碼將程式集遷移成外掛程式並使用
● OSGi.NET外掛程式遷移原理
1 利用工具遷移外掛程式
在這裡示範使用工具將NDatabase(https://ndatabase.codeplex.com/, http://www.cnblogs.com/asxinyu/archive/2013/02/20/2918066.html)這個基於.NET的對象資料庫程式集遷移成OSGi.NET外掛程式並在系統中進行應用。
(1)進入NDatabase網站https://ndatabase.codeplex.com/,從該網站下載程式集,解壓縮後得到一個NDatabase3.dll的程式集。
(2)運行外掛程式遷移工具,點擊案頭上的“開放工廠外掛程式遷移工具”,它彈出以下嚮導。
接著點擊“添加程式集”,然後瀏覽到NDatabase3.dll這個程式集,添加列表,後點擊下一步,填寫外掛程式資訊。
接著,點擊“Next”,在這裡填寫輸出路徑,並將其發布到外掛程式倉庫。
到目前為止,外掛程式的遷移就已經完成,並將遷移成功的外掛程式上傳到外掛程式倉庫,我們來看一下輸出目錄。遷移嚮導在輸出目錄建立了一個UIShell.NDatabase3Plugin的目錄和UIShell.NDatabase3Plugin.zip檔案。UIShell.NDatabase3Plugin的目錄表示的是外掛程式的根目錄,裡麵包含了NDatabase.dll程式集和Manifest.xml外掛程式資訊清單檔;而UIShell.NDatabase3Plugin.zip檔案則是外掛程式打包檔案,裡面通用包含2個檔案,它用於直接上傳到外掛程式倉庫。
這是,我們開啟Manifest.xml可以發現,它聲明了一個UIShell.NDatabase3Plugin外掛程式,版本為1.0.0.0,裡麵包含了一個NDatabase3.dll本地程式集,需要注意的是,這個本地程式集的Share為true,MultipleVersions為false。
<?xml version="1.0" encoding="utf-8" standalone="no"?> <Bundle SymbolicName="UIShell.NDatabase3Plugin" Name="UIShell.NDatabase3Plugin" Version="1.0.0.0" InitializedState="Active" xmlns="urn:uiosp-bundle-manifest-2.0"> <Runtime> <Assembly Path="NDatabase3.dll" Share="true" MultipleVersions="false" /> </Runtime> </Bundle>
Share為true,表示這個外掛程式的NDatabase3.dll可以被其它外掛程式依賴使用;MultipleVersions為false,表示這個程式集不支援多版本,這使得傳統反射的類載入能夠正常工作。下面我將介紹OSGi.NET外掛程式遷移原理。
2 OSGi.NET外掛程式遷移原理
要理解OSGi.NET外掛程式遷移原理,我們得先瞭解一下.NET應用程式的類載入的知識。你也可以查閱http://www.cnblogs.com/baihmpgy/archive/2013/02/27/CLR_Loader_And_OSGi.html(深入理解CLR類載入機制)來深入理解。在這裡,我只是簡述一般情況下的類載入。
2.1 .NET程式集載入簡述
(1)程式集的載入,是在第一次使用到該程式集的類型之後,需要載入類型的中繼資料時,就將類型所在的程式集載入到AppDomain;
(2)類型的載入是在進入一個方法調用時,CLR會檢查這個方法使用到的類型,然後去載入類型,從而引起程式集的載入;
(3)載入程式集由CLR Loader來實現,預設會從全域組件快取、Private Bin Path中載入,並應用了程式集的載入策略比如程式集版本重新導向等。如果全域組件快取不存在所需程式集,則使用這個程式集的名稱對應的檔案名稱,在Private Bin Path進行搜尋,一旦找到檔案便開始載入。如果CLR Loader此時沒有找到程式集,則會拋出一個AssemblyResolver事件,允許自訂程式集載入。
2.2 OSGi.NET程式集載入簡述
OSGi.NET程式集載入結合了OSGi類載入原理和CLR Loader的類載入機制,對CLR Loader類載入機制進行擴充,從而使OSGi.NET可以實現不更改程式集任何代碼的情況下實現了程式集的遷移。以下是OSGi.NET的類載入原理,外掛程式的類載入通過AssemblyResolver事件來實現,按照外掛程式依賴順序進行程式集搜尋。
OSGi.NET的類載入依賴於Manifest.xml外掛程式資訊清單檔的Runtime配置節點,這個節點聲明了外掛程式用於的本地程式集和外掛程式的依賴關係。是一個Manifest.xml的樣本。
2.3 遷移原理
由上所述,將一個程式集遷移成外掛程式,只需要構建出一個合適的Manifest.xml檔案即可。我們需要在Manifest.xml中定義如下資訊:
(1)外掛程式的名稱、版本等基本資料;
(2)外掛程式的Runtime節點資訊,它肯定需要定義幾個Assembly節點,用於指定這個外掛程式包含哪幾個程式集;不過,關於依賴關係,則需要根據實際情況來定義;
(3)定義Assembly節點時,需要指定Assembly相對於Manifest.xml檔案的路徑,Manifest.xml是外掛程式的根節點路徑;
(4)編輯完Manifest.xml後,可以將Manifest.xml、程式集和所需的資源打包成zip上傳的外掛程式倉庫了。
有關OSGi.NET外掛程式遷移就介紹到這,你可以查看http://www.iopenworks.com/Documents/DocumentsList/UserGuide_PluginMigration 視頻來學習如何在5分鐘內將原有程式集遷移成外掛程式。