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


文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

1.背景

三年多前還在上研時,用C#+反射機制寫過插件系統,后來又用MEF寫過插件系統。插件系統本身具有易於擴展的優勢,所以在實際項目中使用很頻繁。即使在B/S項目中,插件的思想也是大行其道,比如前端單頁面+AMD編程便可以理解為一種插件機制,以及后台擴展項目統一打包為一個jar放入主系統jar文件中一起發布,也可以理解為插件思想的運用。

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

a.每一個插件被編譯成了dll,各模塊無法單獨運行,必須依托於主程序。

b.修改插件時,由於生成的是dll,無法快速直觀的查看修改以及調試。

c.每一個插件必須依賴於某一個規范。

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

2.設計思路

此項目背景,即各模塊之間無需通信。並且為了適應各模塊能獨立運行以及各模塊需要單獨調試的需求,這里我直接將各模塊設計為單獨的系統,即編譯后生成exe。在主系統中,通過對配置文件的解譯,生成界面以及綁定相關回調事件。各插件exe以配置規則放入主程序文件夾下即可。

                       

3.進一步探討

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

 

 b.完成各模塊(exe)的單例模式。

由於是直接調用exe,無法利用傳統的單例模式實現。這里可以做一個字典表來存儲,目前哪些模塊已經被調用。

但是,當循環監聽模塊是否退出時,會導致系統卡頓,這里使用多線程來進行模塊開啟,解決監聽模塊導致的界面卡頓。

 

 c.主程序退出時,所有模塊(exe)退出。

用字典表存儲各模塊的實際進程,主程序退出時,將各進程殺死關閉。

 

4.項目例子展示

宿主界面:

 

點擊服務發布模塊:

 

 

 

                                                                                           -----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

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

                                          

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM