OSGI的模块化示例Word文件下载.docx

上传人:b****4 文档编号:6371235 上传时间:2023-05-06 格式:DOCX 页数:20 大小:889.28KB
下载 相关 举报
OSGI的模块化示例Word文件下载.docx_第1页
第1页 / 共20页
OSGI的模块化示例Word文件下载.docx_第2页
第2页 / 共20页
OSGI的模块化示例Word文件下载.docx_第3页
第3页 / 共20页
OSGI的模块化示例Word文件下载.docx_第4页
第4页 / 共20页
OSGI的模块化示例Word文件下载.docx_第5页
第5页 / 共20页
OSGI的模块化示例Word文件下载.docx_第6页
第6页 / 共20页
OSGI的模块化示例Word文件下载.docx_第7页
第7页 / 共20页
OSGI的模块化示例Word文件下载.docx_第8页
第8页 / 共20页
OSGI的模块化示例Word文件下载.docx_第9页
第9页 / 共20页
OSGI的模块化示例Word文件下载.docx_第10页
第10页 / 共20页
OSGI的模块化示例Word文件下载.docx_第11页
第11页 / 共20页
OSGI的模块化示例Word文件下载.docx_第12页
第12页 / 共20页
OSGI的模块化示例Word文件下载.docx_第13页
第13页 / 共20页
OSGI的模块化示例Word文件下载.docx_第14页
第14页 / 共20页
OSGI的模块化示例Word文件下载.docx_第15页
第15页 / 共20页
OSGI的模块化示例Word文件下载.docx_第16页
第16页 / 共20页
OSGI的模块化示例Word文件下载.docx_第17页
第17页 / 共20页
OSGI的模块化示例Word文件下载.docx_第18页
第18页 / 共20页
OSGI的模块化示例Word文件下载.docx_第19页
第19页 / 共20页
OSGI的模块化示例Word文件下载.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

OSGI的模块化示例Word文件下载.docx

《OSGI的模块化示例Word文件下载.docx》由会员分享,可在线阅读,更多相关《OSGI的模块化示例Word文件下载.docx(20页珍藏版)》请在冰点文库上搜索。

OSGI的模块化示例Word文件下载.docx

SimpleModule"

SymbolicName="

Version="

1.0.0.0"

InitializedState="

Active"

<

--模块激活器定义。

ActivatorType="

SimpleModule.Activator"

Policy="

Immediate"

/>

Runtime>

--模块本地程序集声明。

AssemblyPath="

bin\SimpleModule.dll"

Share="

false"

/Runtime>

/Bundle>

这个模块配置定义了模块的特征名称是SimpleModule,激活器是SimpleModule.Activator,包含一个模块工程下的“bin\SimpleModule.dll”本地程序集。

一旦SimpleModuleShell运行,SimpleModule模块会被按装到系统并调用SimpleModule.Activator的Start方法启动模块,反之,一旦停止,Stop方法会被调用。

注意:

Manifest.xml默认编辑器是UIOSP编辑器,它是一个图形化编写模块配置的工具,如下所示。

如果要查看Manifest.xml文件,按F7或者右键查看代码。

5Activator.cs是激活器的定义,在该模块我们定义的激活器如下。

usingSystem;

usingSystem.Collections.Generic;

usingUIShell.OSGi;

namespaceSimpleModule

{

///<

summary>

///模块激活器,它是一个模块启动和停止的入口。

当模块被启动时,激活器的Start方法会被调用;

如果是被停止,则其Stop方法会被调用。

///一般而言,一个模块会在Start方法中向系统提供功能、注册服务、申请如线程等资源等,在Stop方法会执行回收操作,比如关闭功能、

///卸载服务、释放资源等。

需要注意的是,在Start方法中申请的资源必须在Stop方法中得到释放,而且一个模块的Start/Stop方法在运行

///过程可能会被调用多次,必须确保再次调用Start/Stop方法不会出现异常。

/summary>

publicclassActivator:

IBundleActivator

{

///模块启动时调用的方法。

paramname="

context"

模块上下文,通过模块上下文可以获取对框架功能访问、服务注册表访问、模块生命周期等功能访问。

///模块上下文是框架提供给模块唯一的对象。

/param>

publicvoidStart(IBundleContextcontext)

Console.WriteLine("

SimpleModuleisstarted."

);

}

///模块停止时调用的方法。

模块上下文。

publicvoidStop(IBundleContextcontext)

SimpleModuleisstopped."

}

6运行SimpleModuleShell,SimpleModule模块默认会被启动。

该模块在启动时会在控制台输出“SimpleModuleisstarted.”。

7使用RemoteConsole查看模块运行状态,其结果如下

8在RemoteConsole输入“stop/start3”分别用于停止和启动SimpleModule模块,模块状态便发生改变,且激活器Stop/Start方法会被分别调用,并在控制台打印以下信息。

Sample02:

模块初始状态

1在Sample01基础上,修改Manifest.xml中Bundle节点,添加一个“InitializedState="

Install"

”的XML属性。

InitializedState是模块初始状态,可能为Install或者Active,如果不指定默认为Active。

或者在编辑器上直接取消“Startthebundlewhentheframeworkisactivated.”

2运行SimpleModuleShell,利用RemoteConsole查看UIOSP模块状态,如下。

此时,SimpleModule的状态为Install状态。

Sample03:

模块激活器与晚激活

1在Sample01基础上,修改Mainfest.xml中Activator配置节点,添加“Policy="

Lazy"

”属性。

模块有两种激活方式:

立即激活和晚激活。

立即激活意味着模块一旦被启动,其激活器的Start方法便会调用;

而晚激活则会将激活器Start方法的调用推迟到“第一次尝试从该模块加载一个类”时机。

2运行SimpleModuleShell,通过RemoteConsole查看模块运行情况如下。

3为SimpleModule添加一个ClassLoadingToActivate类,该类为测试类,不做任何实现。

publicclassClassLoadingToActivate

4添加另一个模块LoadClassModule,该模块用于加载SimpleModule的ClassLoadingToActivate类,从而导致SimpleModule执行激活。

(1)修改Manifest.xml,将该模块初始状态变为Install,即默认为不启动;

此外,添加对SimpleModule模块的依赖。

?

--初始状态更改为Install,即默认不启动。

LoadClassModule"

LoadClassModule.Activator"

/>

bin\LoadClassModule.dll"

--添加对SimpleModule模块的依赖-->

DependencyBundleSymbolicName="

(2)在Activator中,加载ClassLoadingToActivate类。

namespaceLoadClassModule

IBundlesimpleModule=context.GetBundleByName("

TypeclassLoadingToActivateType=simpleModule.LoadClass(

"

SimpleModule.ClassLoadingToActivate"

//todo:

5运行SimpleModuleShell,启动RemoteConsole查看模块运行情况如下。

6在RemoteConsole执行“start2”,启动LoadClassModule。

一旦LoadClassModule被启动,它的激活器会从SimpleModule加载ClassLoadingToActivate类,从而触发SimpleModule进入Active状态。

此时,在控制台上,将打印“SimpleModuleisstarted.”。

Sample04:

模块本地程序集

1在Sample01基础上,新建一个SimpleModuleLib类库程序集,并添加一个SayHello类。

namespaceSimpleModuleLib

publicclassSayHello

publicvoidHello(stringname)

Console.WriteLine(string.Format("

Hello,{0}."

name));

2在SimpleModule中添加对SimpleModuleLib项目引用,并修改Manifest.xml的Runtime配置节点,添加一个“<

bin\SimpleModuleLib.dll"

”子节点。

--添加模块依赖的本地程序集。

这样做的目的:

(1)使CLR类加载器能够加载到该类;

(2)支持类型晚加载。

3Runtime配置节点定义了模块运行过程中需要的类型信息,Assembly配置节点定义了模块的本地程序集。

这样的定义,其目的是

(1)是CLR类加载其能够从不在标准文件目录下的程序集加载到所需的类型;

(2)支持从程序集晚加载所需类型。

4运行SimpleModuleShell,结果如下。

5注意:

如果模块引用了一个程序集,但是在Manifest.xml的Runtime没有相关的本地程序集Assembly配置,在类型加载时,会发生类型查找不到的异常。

6Assembly配置节点Path属性是必填的项,它用于指定本地程序集相对于模块根路径的相对路径。

Sample05:

模块类型复用与依赖

1在UIOSP中,模块间可以实现类型复用。

这个示例基于Sample04之上,实现了类型复用的示例。

首先修改SimpleModule的Manifest.xml中的SimpleModuleLib本地程序集声明,为该声明一个Share属性。

Share属性则表示该程序集是否能够与其它Bundle复用。

--Share用于声明一个程序集是否可以被其它模块复用。

true"

或者通过编辑器添加一个如下程序集。

2新建一个DependencyModule控制台插件应用程序,然后浏览并引用SimpleModule模块下的bin\SimpleModuleLib.dll程序集,需要注意的是,我们必须把这个引用的“复制本地”变为false。

如下图。

3在Manifest.xml添加对SimpleModule程序集的依赖。

DependencyModule"

DependencyModule.Activator"

bin\DependencyModule.dll"

--添加对SimpleModuleLib程序集的依赖。

AssemblyName="

SimpleModuleLib"

4在Activator使用SimpleModuleLib中的SayHello类。

namespaceDependencyModule

SimpleModuleLib.SayHellosayHello=newSimpleModuleLib.SayHello();

sayHello.Hello("

5运行SimpleModuleShell,结果如下。

Sample06:

模块启动级别

1模块启动级别在模块Manifest.xml,用于设置模块启动顺序、框架安全启动、屏蔽异常模块等。

框架系统模块启动级别为1,级别越小优先级越高。

框架默认启动级别为100,即小于等于100的模块会被框架启动,大于100则不会。

2在Sample01基础上,新建SimpleModule1和SimpleModule2控制台插件应用程序。

3分别设置SimpleModule、SimpleModule1和SimpleModule2的启动级别为2、3和4。

4运行SimpleModuleShell,其结果如下。

Sample07:

片段模块

1在Sample01基础上创建一个FragmentModule的控制台插件应用程序。

片段模块和宿主模块相比,它不是一个正常的模块,不能被启动、停止,不能从片段模块加载任何资源。

片段模块声明的所有配置最终将合并到它指定的宿主模块。

如果我们需要依赖一个片段的程序集,那么我们声明的依赖必须指向该片段模块的宿主模块。

2删除Activator.cs,修改Manifest.xml文件将Activator配置节删掉。

3修改Manifest.xml中Bundle配置节点,添加“HostBundleSymbolicName="

”属性,设置FragmentModule模块的HostBundle是SimpleModule。

4在FragmentModule添加一个SayHelloFromFragment类,如下。

namespaceFragmentModule

publicclassSayHelloFromFragment

5在SimpleModule的Activator加载SayHelloFromFragment类型,并利用反射调用其Hello方法。

TypesayHelloFromFragmentType=context.Bundle.LoadClass(

FragmentModule.SayHelloFromFragment"

if(sayHelloFromFragmentType!

=null)

objectsayHello=System.Activator.CreateInstance(sayHelloFromFragmentType);

MethodInfohelloMethod=sayHello.GetType().GetMethod("

Hello"

helloMethod.Invoke(sayHello,newobject[]{"

FragmentModule."

});

6新建一个FragmentDependencyModule的控制台插件应用程序。

修改Manifest.xml添加对SimpleModule模块依赖,如下。

FragmentDependencyModule"

FragmentDependencyModule.Activator"

bin\FragmentDependencyModule.dll"

7在FragmentDependencyModule模块激活器中使用片段模块的SayHelloFromFragment类。

usingFragmentModule;

namespaceFragmentDependencyModule

SayHelloFromFragmentsayHelloFromFragment=newSayHelloFromFragment();

sayHelloFromFragment.Hello("

8运行SimpleModuleShell,结果如下。

Sample08:

模块与程序集版本

1该框架支持多版本模块和程序集。

一个模块可以在Bundle配置定义添加一个Version属性来设置版本,一个程序集可以在Assembly配置定义添加一个Version属性设置程序集的版本号。

依赖于该模块或者程序集的模块可以在Dependency定义中设定依赖的版本范围或者是特定的版本。

2在Sample05基础之上,修改SimpleModule模块Manifest.xml,添加模块版本和程序集版本。

定义如下。

--设置模块的版本号为1.2。

1.1"

<

--设置该模块一个共享程序集,否则会出现类型加载失败。

3修改DependencyModule模块的Manifest.xml,设置版本依赖约束如下。

--添加对SimpleModuleLib程序集的依赖,它设置的版本范围为0.0~2.0。

BundleVersion="

[0.0,2.0]"

AssemblyName="

AssemblyVersi

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2