OSGi.NET使用笔记
一手资料来源于“开放工厂”,以下程序将会引用到一个核心文件UIShell.OSGi.dll
目前我对于OSGi这个框架的理解就是,主程序搜索并加载插件,以插件方式开放,便于扩展。
现在开始正式的旅程。
首先新建一个C#控制台应用程序(.NET 4.0)按照惯例取名HelloWorld
添加OSGi.NET的引用(上述dll文件),设置输出目录为bin(建议这样做)
这个程序的主函数(Main)中只做一件事,就是启动插件框架,完整代码如下
- using System;
- using UIShell.OSGi;
- namespace OSGi.HelloWorld
- {
- class Program
- {
- static void Main(string[] args)
- {
- using(BundleRuntime bdrt=new BundleRuntime())
- {
- Console.WriteLine("Start bundle...");
- bdrt.Start();
- bdrt.Stop();
- Console.WriteLine("Press any key to continue...");
- Console.ReadKey();
- }
- }
- }
- }
using System;
using UIShell.OSGi; namespace OSGi.HelloWorld
{
class Program
{
static void Main(string[] args)
{
using(BundleRuntime bdrt=new BundleRuntime())
{
Console.WriteLine("Start bundle...");
bdrt.Start();
bdrt.Stop();
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
}
}
现在,我们的各项功能可以通过插件扩展实现。
给两个示例吧,一个是打印消息,一个是弹出消息框,都很简单。
编写插件需要输出为dll形式,因此我们选择新建Class(类库),同样要添加OSGi.NET的引用
两个类的代码分别如下
- using System;
- using UIShell.OSGi;
- namespace PrintMessagePlugin
- {
- public class PrintMessage:IBundleActivator
- {
- public void Start(IBundleContext context)
- {
- Console.WriteLine("<Start> Hello World -- PrintMessage");
- }
- public void Stop(IBundleContext context)
- {
- Console.WriteLine("<Stop> See you next time. -- PrintMessage");
- }
- }
- }
using System;
using UIShell.OSGi; namespace PrintMessagePlugin
{
public class PrintMessage:IBundleActivator
{
public void Start(IBundleContext context)
{
Console.WriteLine("<Start> Hello World -- PrintMessage");
} public void Stop(IBundleContext context)
{
Console.WriteLine("<Stop> See you next time. -- PrintMessage");
} }
}
输出PrintMessage.dll
- using System.Windows.Forms;
- using UIShell.OSGi;
- namespace PopupMsgBoxPlugin
- {
- public class PopupMsgBox:IBundleActivator
- {
- public void Start(IBundleContext context)
- {
- MessageBox.Show("<Start> Hello World!","MsgBox");
- }
- public void Stop(IBundleContext context)
- {
- MessageBox.Show("<Stop> See you.","MsgBox");
- }
- }
- }
using System.Windows.Forms;
using UIShell.OSGi; namespace PopupMsgBoxPlugin
{
public class PopupMsgBox:IBundleActivator
{
public void Start(IBundleContext context)
{
MessageBox.Show("<Start> Hello World!","MsgBox");
} public void Stop(IBundleContext context)
{
MessageBox.Show("<Stop> See you.","MsgBox");
}
}
}
输出PopupmsgBox.dll
为了能让主程序搜索并识别插件信息,我们需要添加清单文件
方法之一是 【项目(右键)】-->【添加(新建项...)】-->【数据(XML文件)】
将*.xml命名为manifest.xml然后根据类库代码编写内容,分别如下
PrintMessage的manifest.xml
- <?xml version="1.0" encoding="utf-8" ?>
- <Bundle xmlns="urn:uiosp-bundle-manifest-2.0"
- SymbolicName="PrintMessagePlugin"
- Name="PrintMessagePlugin"
- Version="1.0.0.0"
- InitializedState="Active" >
- <Activator Type="PrintMessagePlugin.PrintMessage" />
- <Runtime>
- <Assembly Path="PrintMessage.dll" />
- </Runtime>
- </Bundle>
<?xml version="1.0" encoding="utf-8" ?>
<Bundle xmlns="urn:uiosp-bundle-manifest-2.0"
SymbolicName="PrintMessagePlugin"
Name="PrintMessagePlugin"
Version="1.0.0.0"
InitializedState="Active" >
<Activator Type="PrintMessagePlugin.PrintMessage" />
<Runtime>
<Assembly Path="PrintMessage.dll" />
</Runtime>
</Bundle>
PopupMsgBox的manifest.xml
- <?xml version="1.0" encoding="utf-8" ?>
- <Bundle xmlns="urn:uiosp-bundle-manifest-2.0"
- SymbolicName="PopupMesgBoxPlugin"
- Name="PopupMsgBoxPlugin"
- Version="1.0.0.0"
- InitializedState="Active" >
- <Activator Type="PopupMsgBoxPlugin.PopupMsgBox" />
- <Runtime>
- <Assembly Path="PopupMsgBox.dll" />
- </Runtime>
- </Bundle>
<?xml version="1.0" encoding="utf-8" ?>
<Bundle xmlns="urn:uiosp-bundle-manifest-2.0"
SymbolicName="PopupMesgBoxPlugin"
Name="PopupMsgBoxPlugin"
Version="1.0.0.0"
InitializedState="Active" >
<Activator Type="PopupMsgBoxPlugin.PopupMsgBox" />
<Runtime>
<Assembly Path="PopupMsgBox.dll" />
</Runtime>
</Bundle>
然后将生成的*.dll及对应的*.xml清单拷贝到HelloWorld主程序对应的bin/Plugins目录(没有请新建)
其中bin就是HelloWorld主程序的exe输出目录
这是bin目录下的内容
这是bin/Plugins目录下的内容
这两个文件夹下的内容如下
执行主程序HelloWorld,运行结果如下
本文原创,转载请注明出处
OSGi.NET使用笔记的更多相关文章
- OSGI.NET 学习笔记(一)
1. 关于OSGI.NET 在介绍 OSGI.NET 前先介绍下OSGi, OSGI全称为Open Service Gateway Initiative,它一方面指由IBM.Oracle.BEA.SA ...
- OSGi.NET 学习笔记
OSGi.NET 学习笔记 [目录] 持续更新和调整中,本人学习笔记,非官方文档,难免疏漏,仅供参考. OSGi.NET SDK下载地址. 前言及环境准备 模块化和插件化 概念 实例 小结 面向服 ...
- OSGI.NET 学习笔记--架构篇
关于osgi.net ,想必大家也听说过,以下是自己在学习osgi.net 过程中整理出来的内容,供大家学习参与使用. 1. UIOSP 开放工厂框架架构 开放工厂所有插件基于OSGi.NET面向服 ...
- OSGI.NET 学习笔记--应用篇
关于osgi.net ,想必大家也听说过,以下是自己在学习osgi.net 过程中整理出来的内容,供大家学习参与使用. 1. OSGI.NET 与UIOSP OSGi是Open Service Ga ...
- OSGI.NET 插件启动方法
在使用OSGI.NET框架来开发插件过程中,有时为了测试一个插件,或运行一个插件,需要启动主个插件,如果没有主窗口程序,那么该 如何启动一个插件,而不是再开发一个主窗口程序(那样是不是太麻烦,仅仅是为 ...
- net资源1
.net core 例子 https://github.com/aspnet/Docs/tree/master/aspnetcore/fundamentals C#中使用Spire.docx操作Wor ...
- 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld
<深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...
- osgi笔记
Bundle-Classpath可以实现内嵌jar. 一个Bundle的Activator不需要进行Export 一个Package中的类被两个ClassLoader加载,包中的Private cla ...
- OSGI入门笔记
OSGI框架为Java定义了一个动态模块化系统,它使你可以更好地控制代码结构,动态管理代码的生命周期,并且提供了代码写作的松耦合方式:更值得称道的是,它的规范文档描述详尽.--<OSGI实战&g ...
随机推荐
- mysql的卸载重装+导入大量数据失败的解决方案+工具执行和项目执行结果不同
1.卸载 1>快捷键win+r输入regedit进入注册表 找到3个文件夹,全部删除 . HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eve ...
- 尚学linux课程---4、linux网络配置及linux文件
尚学linux课程---4.linux网络配置及linux文件 一.总结 一句话总结: linux下的etc目录是配置文件的目录,所以很多的文件配置操作都可以看到它的身影:比如 init系列命名,比如 ...
- 修改web项目的启动页
修改web项目的启动页
- css3 鼠标悬浮动画效果
CSS3案例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- EJB(Enterprise JavaBean)科普
该文章是引用的,主要用于自己的学习,然后是记载免得忘记的时候到处乱找.结尾有引用地址. 到底EJB是什么?被口口相传的神神秘秘的,百度一番,总觉得没有讲清楚的,仍觉得一头雾水.百度了很久,也从网络的文 ...
- 用原生js封装轮播图
原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不 ...
- 自动生成DTO(Sugar框架)
step1:启动api项目 step2:使用postman工具,填上接口地址http://localhost:7788/api/automapper/AutoMapperSuper step3:表格数 ...
- Python全栈开发:装饰器实例
#!/usr/bin/env python # -*- coding;utf-8 -*- """ 1.将outer函数放入内存 2.遇见@ + 函数名,则将该函数转换为装 ...
- loj2212 方伯伯的OJ
题意: n<=1e8,m<=1e5. 标程: #include<cstdio> #include<algorithm> #include<cstring> ...
- idea-----怎样取消idea默认打开工程
怎样取消idea默认打开工程 引用:https://jingyan.baidu.com/article/656db918c05135e381249cb7.html