OSGI的模塊化示例_第1頁(yè)
OSGI的模塊化示例_第2頁(yè)
OSGI的模塊化示例_第3頁(yè)
OSGI的模塊化示例_第4頁(yè)
OSGI的模塊化示例_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、模塊化示例Sample01:一個(gè)簡(jiǎn)單的模塊1新建一個(gè)名為SimpleModuleShell的“控制臺(tái)宿主應(yīng)用程序”項(xiàng)目。2添加一個(gè)新建項(xiàng)目,名稱為SimpleModule項(xiàng)目,其項(xiàng)目路徑指向SimpleModuleShell項(xiàng)目的binplugins文件夾,這樣一個(gè)默認(rèn)的模塊便創(chuàng)建完成。3新建的SimpleModule模塊由Activator.cs文件和Manifest.xml文件組成。4Manifest.xml是模塊的配置信息,默認(rèn)創(chuàng)建的內(nèi)容如下。這個(gè)模塊配置定義了模塊的特征名稱是SimpleModule,激活器是SimpleModule.Activator,包含一個(gè)模塊工程下的“binSi

2、mpleModule.dll”本地程序集。一旦SimpleModuleShell運(yùn)行,SimpleModule模塊會(huì)被按裝到系統(tǒng)并調(diào)用SimpleModule.Activator的Start方法啟動(dòng)模塊,反之,一旦停止,Stop方法會(huì)被調(diào)用。注意:Manifest.xml默認(rèn)編輯器是UIOSP編輯器,它是一個(gè)圖形化編寫(xiě)模塊配置的工具,如下所示。駕SimpleModuleShellMicrosoftVisualStudio文件(E)編輯視圏(Y)VAssistX項(xiàng)目()生成凹調(diào)試)城IMCD測(cè)試窗口酗幫助(hD勺上戈T,匸kDebugAnyCPU號(hào)Manifesta(mlManifestocml

3、DesignGenerationInformationConfigurationBundleType:HostBundleaJERUnESpecifythegenerationinformationofbundle.SymbolicName(*):Version:|SimpleModuhName:StartLevel:uo-suapqSimpleModuleActivatorSimpleModule.Activator輯決方案資源琶理器偉軸案Simple.4X聡11曲園|國(guó)13解決方案SimpleModuleShell(2個(gè)項(xiàng)目)EI-0SimpleModule由.國(guó)Properties由弓I

4、用!曹Activator.csL.圏Manifestjcml題SimpleModuleShell申.囤Properties由el引用S-口bin曹Program.cs口Lazyactivatethebundleuntiloneclassofitisloaded.FTStartthebundlewhentheframeworkisactivated.Specifythedetailinformationofthisbundle.AuthorCategory:Copyright:Description:ContactAddress:LjPendingChanges就緒如果要查看Manifest.x

5、ml文件,按F7或者右鍵查看代碼。5Activator.cs是激活器的定義,在該模塊我們定義的激活器如下。usingSystem;usingSystem.Collections.Generic;usingUIShell.OSGi;namespaceSimpleModule/模塊激活器,它是一個(gè)模塊啟動(dòng)和停止的入口。當(dāng)模塊被啟動(dòng)時(shí),激活器的Start方法會(huì)被調(diào)用;如果是被停止,則其Stop方法會(huì)被調(diào)用。/一般而言,一個(gè)模塊會(huì)在Start方法中向系統(tǒng)提供功能、注冊(cè)服務(wù)、申請(qǐng)如線程等資源等,在Stop方法會(huì)執(zhí)行回收操作,比如關(guān)閉功能、/卸載服務(wù)、釋放資源等。需要注意的是,在Start方法中申請(qǐng)的資源

6、必須在Stop方法中得到釋放,而且一個(gè)模塊的Start/Stop方法在運(yùn)行/過(guò)程可能會(huì)被調(diào)用多次,必須確保再次調(diào)用Start/Stop方法不會(huì)出現(xiàn)異常。/publicclassActivator:IBundleActivator/模塊啟動(dòng)時(shí)調(diào)用的方法。/paramname=context模塊上下文,通過(guò)模塊上下文可以獲取對(duì)框架功能訪問(wèn)、服務(wù)注冊(cè)表訪問(wèn)、模塊生命周期等功能訪問(wèn)。/模塊上下文是框架提供給模塊唯一的對(duì)象。/parampublicvoidStart(IBundleContextcontext)Console.WriteLine(SimpleModuleisstarted.);/summ

7、ary/模塊停止時(shí)調(diào)用的方法。/summary/paramname=context模塊上下文。/parampublicvoidStop(IBundleContextcontext)Console.WriteLine(SimpleModuleisstopped.);6運(yùn)行SimpleModuleShell,SimpleModule模塊默認(rèn)會(huì)被啟動(dòng)。該模塊在啟動(dòng)時(shí)會(huì)在控制臺(tái)輸出“SimpleModuleisstarted.。7使用RemoteConsole查看模塊運(yùn)行狀態(tài),其結(jié)果如下8在RemoteConsole輸入“stop/start3”分別用于停止和啟動(dòng)SimpleModule模塊,模塊狀態(tài)

8、便發(fā)生改變,且激活器Stop/Start方法會(huì)被分別調(diào)用,并在控制臺(tái)打印以下信息。Sample02:模塊初始狀態(tài)1在Sample01基礎(chǔ)上,修改Manifest.xml中Bundle節(jié)點(diǎn),添加一個(gè)“initializedstate二install”的XML屬性。InitializedState是模塊初始狀態(tài),可能為Install或者Active,如果不指定默認(rèn)為Active?;蛘咴诰庉嬈魃现苯尤∠癝tartthebundlewhentheframeworkisactivated.”ManiifestJcmVDesignuoRE-lQJLlQJBG皂nerationInformationCon

9、figurationBundleType:HostBundle即ERUnHSpecifythegenerationinformationofbundle.Version:SimpleModlullegju-ajgjsName:StartLevel:UQ-sumIJU1Lazyactivatethebundleuntiloneclassofitisloaded.SimpleModuleActivator:SimpleModule.ActivatorCopyright:Category:Specifythedetailinformationofthisbundle.Author:ContactAd

10、dress:運(yùn)行SimpleModuleShell,利用RemoteConsole查看UIOSP模塊狀態(tài),如下。此時(shí),SimpleModule的狀態(tài)為Install狀態(tài)。Sample03:模塊激活器與晚激活1在Sample01基礎(chǔ)上,修改Mainfest.xml中Activator配置節(jié)點(diǎn),添加“Policy=Lazy屬性。模塊有兩種激活方式:立即激活和晚激活。立即激活意味著模塊一旦被啟動(dòng),其激活器的Start方法便會(huì)調(diào)用;而晚激活則會(huì)將激活器Start方法的調(diào)用推遲到“第一次嘗試從該模塊加載一個(gè)類(lèi)”時(shí)機(jī)。2運(yùn)行SimpleModuleShell,通過(guò)RemoteConsole查看模塊運(yùn)行情況

11、如下。3為SimpleModule添加一個(gè)ClassLoadingToActivate類(lèi),該類(lèi)為測(cè)試類(lèi),不做任何實(shí)現(xiàn)。namespaceSimpleModulepublicclassClassLoadingToActivate4添加另一個(gè)模塊LoadClassModule,該模塊用于加載SimpleModule的ClassLoadingToActivate類(lèi),從而導(dǎo)致SimpleModule執(zhí)行激活。(1)修改Manifest.xml,將該模塊初始狀態(tài)變?yōu)镮nstall,即默認(rèn)為不啟動(dòng);此外,添加對(duì)SimpleModule模塊的依賴。!一初始狀態(tài)更改為Install,即默認(rèn)不啟動(dòng)。-(2)在A

12、ctivator中,加載ClassLoadingToActivate類(lèi)。namespaceLoadClassModulepublicclassActivator:IBundleActivatorpublicvoidStart(IBundleContextcontext)IBundlesimpleModule=context.GetBundleByName(SimpleModule);TypeclassLoadingToActivateType=simpleModule.LoadClass(SimpleModule.ClassLoadingToActivate);publicvoidStop(I

13、BundleContextcontext)/todo:5運(yùn)行SimpleModuleShell,啟動(dòng)RemoteConsole查看模塊運(yùn)行情況如下。StateTypeBundleActiueHostLoadClassModuleActiueHostUIShe11.RemotingManagementActiueHostSimpleModuleActiueHostUlShell.UebSeruiceWrapperSeruicelistBundleRuntimeislaunched.6在RemoteConsole執(zhí)行“start2”,啟動(dòng)LoadClassModule。一旦LoadClassMod

14、ule被啟動(dòng),它的激活器會(huì)從SimpleModule加載ClassLoadingToActivate類(lèi),從而觸發(fā)SimpleModule進(jìn)入Active狀態(tài)。UIShell.OSGiRemoteConsolestart2Bundle:LoadClassModulestarted.Ctt21此時(shí),在控制臺(tái)上,將打印“SimpleModuleisstarted.”。Sample04:模塊本地程序集1在Sample01基礎(chǔ)上,新建一個(gè)SimpleModuleLib類(lèi)庫(kù)程序集,并添加一個(gè)SayHello類(lèi)。namespaceSimpleModuleLibpublicclassSayHellopubli

15、cvoidHello(stringname)Console.WriteLine(string.Format(Hello,0.,name);2在SimpleModule中添加對(duì)SimpleModuleLib項(xiàng)目引用,并修改Manifest.xml的Runtime配置節(jié)點(diǎn)添加個(gè)“AssemblyPath=binSimpleModuleLib.dll/”子節(jié)點(diǎn)。?xmlversion=1.0encoding=utf-8?Bundlexmlns=urn:uiosp-bundle-manifest-2.0SymbolicName=SimpleModuleActivatorType=SimpleModul

16、e.Activator/RuntimeAssemblyPath=binSimpleModule.dll/!一添加模塊依賴的本地程序集。這樣做的目的:(1)使CLR類(lèi)加載器能夠加載到該類(lèi);(2)支持類(lèi)型晚加載。-AssemblyPath=binSimpleModuleLib.dll/Runtime/BundleRuntime配置節(jié)點(diǎn)定義了模塊運(yùn)行過(guò)程中需要的類(lèi)型信息Assembly配置節(jié)點(diǎn)定義了模塊的本地程序集。這樣的定義其目的是(1)是CLR類(lèi)加載其能夠從不在標(biāo)準(zhǔn)文件目錄下的程序集加載到所需的類(lèi)型;(2)支持從程序集晚加載所需類(lèi)型。運(yùn)行SimpleModuleShell,結(jié)果如下。5注意:如果

17、模塊引用了一個(gè)程序集,但是在Manifest.xml的Runtime沒(méi)有相關(guān)的本地程序集Assembly配置在類(lèi)型加載時(shí)會(huì)發(fā)生類(lèi)型查找不到的異常。6Assembly配置節(jié)點(diǎn)Path屬性是必填的項(xiàng),它用于指定本地程序集相對(duì)于模塊根路徑的相對(duì)路徑。Sample05:模塊類(lèi)型復(fù)用與依賴1在UIOSP中,模塊間可以實(shí)現(xiàn)類(lèi)型復(fù)用。這個(gè)示例基于Sample04之上,實(shí)現(xiàn)了類(lèi)型復(fù)用的示例。首先修改SimpleModule的Manifest.xml中的SimpleModuleLib本地程序集聲明,為該聲明一個(gè)Share屬性。Share屬性則表示該程序集是否能夠與其它Bundle復(fù)用。!一添加模塊依賴的本地程序

18、集。這樣做的目的:(1)使CLR類(lèi)加載器能夠加載到該類(lèi);(2)支持類(lèi)型晚加載。-!-Share用于聲明一個(gè)程序集是否可以被其它模塊復(fù)用。一或者通過(guò)編輯器添加一個(gè)如下程序集。ManifestJcmVDesiigni寸XBundleRuntimeConfigurationThecontEntofthissectionismadeupoftwosections:Assemblies:liststhErequiredassemblieswhichareonlyusedinthisbundhorsharedwithotherbundies.即:J-AJ即5匚.25匚CJ4XUJDependencies:

19、liststhEdependentbundlesandassemblies.2新建一個(gè)DependencyModule控制臺(tái)插件應(yīng)用程序,然后瀏覽并引用SimpleModule模塊下的binSimpleModuleLib.dll程序集,需要注意的是,我們必須把這個(gè)引用的“復(fù)制本地”變?yōu)閒alse。如下圖。publicvoidStart(IBundleContextcontext)3在Manifest.xml添加對(duì)SimpleModule程序集的依賴。4在Activator使用SimpleModuleLib中的SayHello類(lèi)。namespaceDependencyModulepubliccl

20、assActivator:IBundleActivatorpublicvoidStart(IBundleContextcontext)/todo:SimpleModuleLib.SayHellosayHello=newSimpleModuleLib.SayHello();sayHello.Hello(DependencyModule);/todo:5運(yùn)行SimpleModuleShell,結(jié)果如下。 HYPERLINK file:/CUsers/lorry/Documents/VisualStudio2008/Prqjects/Samples/1Modularity/05BundleDep,.

21、,SimpleModuleisstarted.Hello,DependencModule.Pressentertoexit-Sample06:模塊啟動(dòng)級(jí)別1模塊啟動(dòng)級(jí)別在模塊Manifest.xml,用于設(shè)置模塊啟動(dòng)順序、框架安全啟動(dòng)、屏蔽異常模塊等??蚣芟到y(tǒng)模塊啟動(dòng)級(jí)別為1,級(jí)別越小優(yōu)先級(jí)越高??蚣苣J(rèn)啟動(dòng)級(jí)別為100,即小于等于100的模塊會(huì)被框架啟動(dòng),大于100則不會(huì)。2在Sample01基礎(chǔ)上,新建SimpleModulel和SimpleModule2控制臺(tái)插件應(yīng)用程序。分別設(shè)置SimpleModule、SimpleModule1和SimpleModule2的啟動(dòng)級(jí)別為2、3和4。4運(yùn)

22、行SimpleModuleShell,其結(jié)果如下。Sample07:片段模塊1在Sample01基礎(chǔ)上創(chuàng)建一個(gè)FragmentModule的控制臺(tái)插件應(yīng)用程序。片段模塊和宿主模塊相比,它不是一個(gè)正常的模塊,不能被啟動(dòng)、停止,不能從片段模塊加載任何資源。片段模塊聲明的所有配置最終將合并到它指定的宿主模塊。如果我們需要依賴一個(gè)片段的程序集,那么我們聲明的依賴必須指向該片段模塊的宿主模塊。2刪除Activator.cs修改Manifest.xml文件將Activator配置節(jié)刪掉。3修改Manifest.Xml中Bundle配置節(jié)點(diǎn),添加“HostBundleSymbolicName=SimpleM

23、odule屬性設(shè)置FragmentModule模塊的HostBundle是SimpleModule。ManifestJcmVDesiigniuore-jqjuqjdGenerationInformationConfigurationBundi亡Type:FragmentBundl亡SpecifythegenerationinformationofbundI巳SymbolicName(*):Version:FraqniienitModuVe即皂aj即Su.25uaj4xluName:FragmentModul亡HostBundleVersionRange:HostBundleSymbolicNa

24、me(*):SimpleModuleEditSpecifythedetailinformationofthisbundle.Author:Copyright:匚ategory:Description:ContactAddress:在FragmentModule添加一個(gè)SayHelloFromFragment類(lèi),如下。namespaceFragmentModulepublicclassSayHelloFromFragmentpublicvoidHello(stringname)Console.WriteLine(string.Format(Hello,0.,name);在SimpleModule

25、的Activator加載SayHelloFromFragment類(lèi)型,并利用反射調(diào)用其Hello方法。namespaceSimpleModulepublicclassActivator:IBundleActivatorTypesayHelloFromFragmentType=context.Bundle.LoadClass(FragmentModule.SayHelloFromFragment);publicvoidStart(IBundleContextcontext)publicvoidStart(IBundleContextcontext)if(sayHelloFromFragmentType!=null)objectsayHello=System.Activator.CreateInstance(sayHelloFromFragmentType);MethodInfohelloMethod=sayHello.GetType().GetMethod(Hello);helloMethod.Invoke(sayHello,newobjectFragmentModule.);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論