OSGI(六)介面外掛程式製作2

2021-06-20 11:42:04 字數 3030 閱讀 6516

上篇部落格中,我們講解了建立拓展模型和建立拓展模型物件,下面我們繼續介紹,完成後面的步驟。

主介面為上下布局,上部分是乙個menustrip,下部分是乙個tabcontrol。下面我們將通過osgi.net的擴充套件機制,將其它外掛程式註冊的擴充套件資訊轉換成這個主介面的選單項。

首先,我們先看一下如何獲取擴充套件資訊並監聽事件。**如下,在

/// /// 處理擴充套件資訊。

///

private void hanldeextension()

// 4 監聽擴充套件變更事件

bundlecontext.extensionchanged += bundlecontextextensionchanged;

}

其次,是擴充套件變更事件處理的**,當外掛程式啟動時,其擴充套件資訊註冊到

osgi.net核心,當外掛程式解除安裝時,其擴充套件資訊會被解除安裝掉,因此

,當擴充套件資訊新增時,我們需要為其建立選單項;反之,需要刪除選單項和已經顯示的內容。

private void bundlecontextextensionchanged(object sender, extensioneventargs e)

else if (e.action == collectionchangedaction.remove)}}

下面我們看一下為

建立相應介面元素的**,這裡我們利用該物件建立了乙個頂層選單項和所有子選單項。 

/// /// 擴充套件變更事件是乙個非同步事件,即是乙個新的執行緒來處理事件。

/// 因此,需要將擴充套件變更事件對介面的變更通過**傳送到介面

/// 執行緒,由其來更新介面。

///

;// 如果當前執行緒不是介面執行緒,則通過invoke來處理介面變更

if (invokerequired)

else // 否則,直接操作介面

}

最後是移除介面元素的原始碼。

/// /// 擴充套件變更事件是乙個非同步事件,即是乙個新的執行緒來處理事件。

/// 因此,需要將擴充套件變更事件對介面的變更通過**傳送到介面

/// 執行緒,由其來更新介面。

///

workspacetabcontrol.tabpages.remove(tab);}}

}};// 如果當前執行緒不是介面執行緒,則通過invoke來處理介面變更

if (invokerequired)

else // 否則,直接操作介面}}

總結:

下面總結一下如何做介面外掛程式:

首先建立乙個外掛程式

---將

extensionmodel

資料夾中的

3個基礎類新增進來——新增介面窗體——編寫介面窗體**。用**展示為:

建立乙個空

windows

窗體或高階

windows

窗體,在

program.cs

檔案中加入以下**,作為程式的入口點;

再新增乙個

windows

窗體外掛程式,以下**操作都是該類庫中的操作。

通過run

(forminstance

)找到外掛程式的

mainform

窗體,例項化,因為是介面外掛程式所以要處理節點(即之前提過的掃瞄

manifest

檔案,通過其內容動態載入選單)。

看一下hanldeextension

()方法,步驟很清楚先例項化在獲取拓展資訊;

不管是windows

或web

或其他應用程式

,**變動不大

,只需要把相應的控制項名稱、控制項載入的個別屬性更改一下即可,用起來很方便。

介面外掛程式完成之後,我們將外掛程式發布之後,真正主程式的目錄如下截圖:

很清晰,明了,通過

program.cs

檔案,載入外掛程式,通過介面外掛程式載入其他選單,主程式只是乙個容器,各個功能都是乙個個的積木,搭起來就是乙個多功能自定義的簡單程式。通過這張圖可以看出該程式的健壯性很好,即使某個外掛程式不能用了,但是不會影響其他功能外掛程式的使用。

需要注意的是:我們做的介面外掛程式的基礎是

iopenwork

提供的uishell.pageflowservice

外掛程式。我們通過引用該外掛程式才能做響應的操作。

別忘了把這句**放在該外掛程式的

manifest

檔案中,否則外掛程式介面不會顯示載入。

至此,介面外掛程式製作介紹完成,不足之處敬請指正~~~~~~

六 介面 Spring介面FactoryBean

factorybean是用來向容器中注入bean的介面。而beanfactory是從容器中取bean的介面。定義fish實體類 author zhangjianbing date 2020年9月23日 data public class fish public fish string name,in...

TypeScript 基礎2 介面

介面通常以inte ce來宣告,介面是抽象方法的集合,即只宣告,不定義具體值。類描述物件的屬性和方法。介面則包含類要實現的方法 除非實現介面的類是抽象類,否則該類要定義介面中的所有方法 乙個實現介面的類,必須實現介面內所描述的所有方法,否則就必須宣告為抽象類。介面支援多繼承,乙個類可以實現多個介面 ...

mochijson2 介面使用

傳聞erlang otp會提供json資料處理庫,有些討論但不見下文,暫且用mochiweb的mochijson2.erl吧 decode test mochijson2 decode sjson mjson mochijson2 decode sjson io fwrite test json t...