天天看點

淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)

三年多前還在上研時,用C#+反射機制寫過插件系統,後來又用MEF寫過插件系統。插件系統本身具有易于擴充的優勢,是以在實際項目中使用很頻繁。即使在B/S項目中,插件的思想也是大行其道,比如前端單頁面+AMD程式設計便可以了解為一種插件機制,以及背景擴充項目統一打包為一個jar放入主系統jar檔案中一起釋出,也可以了解為插件思想的運用。

這裡我們回到C/S插件系統編寫的問題上。由于之前諸多項目編寫是将插件編譯成dll,然後進行解析。這樣做有其好處,即宿主中可以對各個子產品解析,完成插件間、插件和主程式間的通信。但是在實際項目中,同樣也有其劣勢:

a.每一個插件被編譯成了dll,各子產品無法單獨運作,必須依托于主程式。

b.修改插件時,由于生成的是dll,無法快速直覺的檢視修改以及調試。

c.每一個插件必須依賴于某一個規範。

當我們并不需要插件之間、插件和主程式之間有通信發生時,我們是否可以舍棄這種dll插件形式呢?

此項目背景,即各子產品之間無需通信。并且為了适應各子產品能獨立運作以及各子產品需要單獨調試的需求,這裡我直接将各子產品設計為單獨的系統,即編譯後生成exe。在主系統中,通過對配置檔案的解譯,生成界面以及綁定相關回調事件。各插件exe以配置規則放入主程式檔案夾下即可。

淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)

a.C#調用exe,使用Process和 ProcessStartInfo配合完成。

淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)

 b.完成各子產品(exe)的單例模式。

由于是直接調用exe,無法利用傳統的單例模式實作。這裡可以做一個字典表來存儲,目前哪些子產品已經被調用。

但是,當循環監聽子產品是否退出時,會導緻系統卡頓,這裡使用多線程來進行子產品開啟,解決監聽子產品導緻的界面卡頓。

淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)
淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)

 c.主程式退出時,所有子產品(exe)退出。

用字典表存儲各子產品的實際程序,主程式退出時,将各程序殺死關閉。

淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)

宿主界面:

淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)

點選服務釋出子產品:

淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)

                                                                                   如果您覺得本文确實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                          

淺談C#中一種類插件系統編寫的簡單方法(插件間、插件宿主間本身不需要通信)

繼續閱讀