這是大約在3-4年前完成的一個C#實現的OSGi框架,實現的過程參照了OSGi規範與與一些實現思路(感謝當時的那些資料與項目),此框架雖然僅在幾個小型項目有過實際的應用,但OSGi的規範實現仍是相對比較完整的,包涵了一些基本的要素,因爲我的的項目重心已經轉移,如今打算把它公開出來,供你們參考:git
OSGi.NET框架是一個參照了OSGi規範的模塊化管理框架。框架爲應用程序擴展(組件(bundle))提供了一個標準環境。整個框架能夠劃分爲一些層次:github
目前OSGi.NET具備以下特點:編程
啓動一個OSGi.NET應用程序僅須要以下代碼框架
using System; using OSGi.NET.Core.Root; namespace ConsoleDemo { class Program { static void Main(string[] args) { //建立框架工廠 var frameworkFactory = new FrameworkFactory(); //建立框架內核 var framework = frameworkFactory.CreateFramework(); //初始化框架 framework.Init(); //啓動框架 framework.Start(); Console.ReadLine(); } } }
建立一個OSGi.NET項目須要:
1.引用框架內核程序集OSGi.NET.dll
2.添加框架內核配置文件OSGi.NET.properties
3.如須要日誌支持,添加log4net.config文件及log4net.dll程序集引用模塊化
OSGi.NET項目的默認文件目錄結構以下
/程序目錄
/程序目錄/Bundles/
/程序目錄/Bundles/模塊A/
/程序目錄/Bundles/模塊A/Manifest.xml
/程序目錄/Bundles/模塊A/模塊A.dll
/程序目錄/Bundles/模塊A/Libs/
/程序目錄/Bundles/模塊A/Libs/* .dll
/程序目錄/Bundles/模塊B/
/程序目錄/Bundles/模塊C/
/程序目錄/Libs/(可選)
/程序目錄/OSGi.NET.properties
注:
程序目錄中的Libs文件夾存放個Bundles的共享程序集(也可經過在配置文件中配置共享清單),如接口契約、公共第三方類庫等。
模塊A中的Libs文件夾存放其私有程序集。
Manifest.xml做爲程序清單文件對模塊進行自描述。
OSGi.NET.properties爲框架內核配置文件
關於加載次序:
因爲業務需求,各模塊存在依賴關係的可能,因此模塊加載也會有加載順序的要求,此時能夠經過清單文件中Manifest.xml,Bundle節點的StartLevel屬性對其加載次序進行設置。數值越小,加載越前。
關於Bundle引用程序集搜索原則:
1.根據加載的Bundle引用程序集,依據程序集名稱+版本號匹配原則,優先從[/程序目錄/Libs/]目錄或共享清單中搜索。
2.如第一步無匹配,則根據程序集名稱從[/程序目錄/Bundles/模塊A/Libs/*.dll]目錄搜索,並將搜索到的程序集對應版本關聯Bundle。
3.各Bundle下Libs目錄程序集在加載中作了Bundle間的隔離,確保不一樣的Bundle引用的程序集間不會形成影響。即:如存在共享程序集請放置[/程序目錄/Libs/]目錄或在共享清單配置。spa
Intro: http://www.diginfo.me/osgi-net-implement日誌