模块清单文件(Manifest.xml)位于模块标准目录结构的根目录之下,它定义了模块的 基本信息、模块激活信息、模块类加载相关的运行时信息、服务定义信息、模块扩展定义信息 以及模块详细信息。这一小节将详细介绍清单文件的定义。
清单文件示例
以下是一个清单文件的示例。这个清单文件的命名空间是“urn:uiosp-bundle-manifest-2.0” ,它定义了一个唯一名称为ShellPlugin,名称也为ShellPlugin的模块。这个模块的版本是 1.0.0.0,当UIOSP框架被启动时,这个模块会被加载并自动激活。此外,这个模块启动级别 为2,即它在级别为1的所有模块后面被启动。
<?xml version="1.0" encoding="utf-8"?><Bundle xmlns="urn:uiosp-bundle-manifest-2.0" SymbolicName="ShellPlugin" Version="1.0.0.0" Name="ShellPlugin" ??InitializedState="Active" StartLevel="2"> ?<Activator Type="ShellPlugin.Activator" Policy="Immediate" /> ?<Runtime> ???<Assembly Path="bin\ShellPlugin.dll" Share="false" /> ?</Runtime> ?<ExtensionPoint Point="ShellPlugin.MenuStrip" /></Bundle>
此外,以上清单文件定义了该模块的一个本地程序集“bin\ShellPlugin.dll”,该 程序集位置相对于模块的根目录,当然,你也可以指定一个绝对目录。模块还定义了一个 激活器和扩展点。关于这些定义,我们在以下将详细介绍。
清单文件结构
清单文件是一个标准格式的XML文件,该文件的XML节点和属性命名规则采用C#的Property 方式命名,即每一个单词的头一个字母大写,单词间没有分隔符。
Bundle节点
Bundle是整个清单文件的根节点。该节点用于定义模块的特征名称(唯一标识)、 名称、版本号、模块在平台启动后的初始状态、启动级别、宿主模块标识、宿主模块版本 和命名空间属性。模块的特征名称是必须填写的属性,命名空间用于在编写XML文件时获得 智能提示。该节点的结构如图4-3所示。
Bundle节点的属性的详细描述如下:
- xmlns:定义了清单文件的名字空间,其值固定为"urn:uiosp-bundle-manifest-2.0"。
- SymbolicName:插件的唯一名称,必填属性。
- Version:插件的版本,比如1.2.0.3,默认为1.0.0.0,可选属性。
- Name:插件的名称,可选属性。
- InitializedState:平台加载插件后,插件处于的默认状态,其默认值为Active,可选属性。
- StartLevel:插件的启动级别,启动级别越小优先级越高,越先被启动,普通插件的启动级别一般大于等于2,可选属性。
- HostBundleSymbolicName:插件的宿主唯一名称,一旦声明了该属性,则当前插件便是一个片段插件。片段插件不能被当成宿主插件来使用,它仅是作为宿主的一部分而存在,在宿主解析时,会自动将片段插件的定义附加到宿主。 因此片段插件不能定义StartLevel、InitializedState和Activator,且不能从片段加载类或者资源。如果需要加载,必须通过其宿主来实现。
- HostBundleVersion:宿主插件版本约束,可以不填写(版本无关)、固定的版本(1.0.0.0)或者某一范围版本([1.0, 2.0))。
Bundle节点还包含:至多一个Activator节点、一个Runtime节点、至多一个Services节点 、若干ExtensionPoint节点、若干Extension节点和至多一个BundleInfo节点。
Activator节点
该节点定义一个模块启动和停止的入口。Activator节点的XML结构如图4-4所示。
该节点由Type和Policy属性组成。它们的描述如下:
- Type:插件激活器类型全名称,比如ConsolePlugin1.Activator,该类型必须实现IBundleActivator接口,必填属性。
- Policy:激活策略,Immediate或者Lazy,分别为立即激活或者晚激活。立即激活是指一旦插件执行启动,激活器的Start(IBundleContext context)会被调用并进入Active状态;而晚激活则是一旦插件执行启动,只是将状态变为Starting,而激活器的Start(IBundleContext context)方法会推迟到直到从该插件加载一个类型时才调用,从而进入Active状态。该属性为可选属性。
Runtime节点
该节点定义了模块的类型空间。模块类型空间是指模块可访问的类型的集合,它 决定了一个模块向外提供的功能。UIOSP平台中,每一个模块都具有其独立的类型空间和 类加载器,类加载器用于从其类型空间中加载类型。模块类型空间由本地程序集和依赖 的其它模块的程序集构成。Runtime节点的XML结构如图4-5所示。
该节点由Assembly和Dependency节点组成,分别表示模块本地程序集和依赖程序集。 它们的描述如下。
Assembly节点
Assembly节点用于定义模块一个本地程序集,本地程序集分为私有程序集和 共享程序集,后者表示该程序集的类型可以被其它模块共享使用。私有程序集的 Share属性为false,相反,共享程序集为true。该节点由Path和Share属性构成, 它们的描述如下:
- Path:程序集的路径,可以是相对于插件根目录的路径,也可以是绝对路径,必选属性。
- Share:程序集是否可以被其它插件共享,默认为false,可选属性。
Dependency节点
Dependency节点用于模块一个程序集依赖声明,它表示该插件引用了另一个 插件在Assemly定义的Share为true的程序集。该节点由BundleSymbolicName、BundleVersion、 AssemblyName、AssemblyVersion和Resolution属性组成,其描述如下:
- BundleSymbolicName:依赖程序集所在的插件唯一名称。
- BundleVersion:依赖程序集所在的插件的版本约束,可以不填写(版本无关)、固定的版本(1.0.0.0)或者某一范围版本([1.0, 2.0)),可选属性。
- AssemblyName:程序集名称,可选属性,如果没有指明依赖的程序集名称,则意味着依赖指定插件所有程序集。
- AssemblyVersion:程序集版本,可以不填写(版本无关)、固定的版本(1.0.0.0)或者某一范围版本([1.0, 2.0)),可选属性。
- Resolution:依赖解析方式,Mandatory或者Optional,分别表示依赖必须强制解析成功这个插件才能够被启动、依赖可以解析失败。
Services节点
Services节点用于声明一个模块向外暴露的服务,这些服务在模块启动时自动注册到UIOSP 平台,并在模块停止时从平台卸载。模块可以通过两种方式向平台注册服务,一种方法是通过激活器 的Start方法中的IBundleContent类型参数的AddService来注册,另一种方法是通过Manifest.xml 的文件Services节点来注册服务。Services节点的结构如图4-6所示。
Services节点由若干个Service节点组成,Service节点用于表示一个具体的服务, 该节点由Interface和Type属性组成,它们的描述如下:
- Interface:服务的接口全名称,即该服务的契约,使用“,”分割多个接口,如ConsolePlugin1.IMyService1,ConsolePlugin1.IMyService2。
- Type:服务的实现类型全名称,如ConsolePlugin1.MyService。
ExtensionPoint节点
该节点用于定义一个模块向其它模块暴露的扩展功能,这样其它模块可以通过定义 Extension节点来注入相应的扩展功能实现。UIOSP通过ExtensionPoint和Extension这一对 XML配置节点来实现模块的扩展。一般而言,插件扩展需要通过2个步骤实现:(1)在 Manifest.xml定义一个扩展点;(2)在插件通过IBundleContext.ExtensionChanged 事件和IBundleContext.GetExtensions获取其它插件对其扩展并进行处理。该平台 所有的扩展信息都具备动态性,即当模块被启动时扩展点和扩展会注册到平台,相反,当 模块被卸载时,它们会被卸载掉。该节点的结构如图4-7所示。
该节点由Point和Schema属性组成,它们的描述如下:
- Point:扩展点名称。
- Schema:扩展信息的XML定义需要遵守的架构。
Extension节点
该节点用于定义一个模块对另一个模块的扩展。其结构如图4-8所示
该通过Point属性指定其对应的扩展点的名称,它包含的所有子节点就是注册到 扩展点的内容的信息,子节点必须通过扩展点定义的Schema的验证。以下是Extension 定义的示例。该示例定义的扩展其对应的扩展点是UIShell.SiteMap。当该模块启动时, 它会把Extension包含的信息注册到平台,暴露出UIShell.SiteMap扩展点的模块可以 通过模块上下文获取这个定义,然后在导航栏上创建相应的节点。
<Extension Point="UIShell.SiteMap"> ?<siteMapNode path="/" title="Home" description="Home"> ???<siteMapNode title="Home" description="Home" url="~/default.aspx"/> ???<siteMapNode title="Introduction" url="~/Plugins/ReportPlugin/default.aspx"/> ???<siteMapNode title="Report Demo" url="~/Plugins/ReportPlugin/test.aspx"/> ?</siteMapNode> ?<siteMapNode path="/Products" title="Products" description="Our products" ???url="~/Products.aspx"> ???<siteMapNode title="Hardware" description="Hardware choices" ???????url="~/Hardware.aspx" /> ???<siteMapNode title="Software" description="Software choices" ???????url="~/Software.aspx" /> ?</siteMapNode></Extension>
BundleInfo节点
该节点用于定义模块的详细信息,为可选节点,其结构如图4-9所示。
该节点包含的属性的详细描述如下:
- ManifestVersion:清单版本,为2。
- DocumentLocation:文档位置。
- UpdateLocation:插件更新时下载新插件的地址。
- Category:类别。
- Description:详细描述。
- Author:作者。
- ContactAddress:联系方式称。
- Copyright:版权声明。
Manifest.xml完整架构图
清单文件的XML完整架构如图4-10所示。
osgi.net从入门到精通系列之四
原文地址:https://www.cnblogs.com/iwanwu/p/9926166.html