使用反射和codeDOM實現C#插件開發(1)由來

當前已經開發完成了一個主程序框架,但是有些新功能要加進去。那麼在不修改主程序的情況下,用什麼方法能實現快速、方便的將新功能實現呢?

上網查了一下,發現C#單機程序開發時,插件基本都是採用反射機制進行開發的。(請教大牛,還有沒有其他方式,做插件開發的,望不吝賜教啊!)

網上也有很多反射的例子,但是我也有些特殊需求。

因爲我從事的是工程計算相關的工作,除了一些商業軟件,如ANSTS,FLUENT等來進行工程力學計算外,很多客戶有自己的一些算法,比如,有計算導彈彈道的,有計算水輪機冷卻的,有計算核電設備應力修正的,等等。

這些算法有一個通用的方式,就是定義一些參數,然後調用各種力學公式,算出一些結果參數。客戶根據這些結果參數來判斷設計是否合理。

那麼客戶的計算流程就是,根據不同工況,設置不同的參數值,然後調用函數,進行計算,得出結果。


那麼,這些輸入參數在不同工況下,採用不同值怎麼辦呢?僅僅憑藉反射,貌似只能獲取信息,不能往裏面傳遞信息吧?(請教大牛,是不是這樣的?)


我需要有個東西,能夠向dll中的參數傳遞信息。這時候,我想到了codeDOM。每次調用dll時候,能根據dll的信息,自動創建一個類,使用一個函數向dll實例中傳遞參數。


這樣,又有問題了:

1.我的具有新功能的dll到底應該怎麼寫,才能被我的主程序認識並調用呢?dll中的參數我怎麼能設置默認值,並能夠取出來呢?

2.這個動態類的函數怎麼寫呢?怎麼能夠將dll的實例傳進去,並能夠點出其中包含的對象呢?怎麼才能夠支持各種各樣的數據類型呢?

唉,都需要去測試啊!


現在,終於有了初步答案。

1.這個dll必須要有一些約定,比如定義一些接口,實現求解計算的功能。定義一些屬性,用來標記哪些參數是可以被反射的輸入參數,哪些參數是可以被反射的輸出參數;還用來標記每個參數的默認值,每個參數的說明等。

2.動態類使用固定namespace,classname,固定的函數名稱等,讓我的主程序能夠寫死調用。通過上一步反射得到各個輸入參數,然後在動態類的函數中對這些變量進行賦值。


好了,下面可以進行編碼測試了!



發佈了36 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章