2011-02-26 39 views
5

我不確定最好的解釋方法,所以請留下評論,如果你不明白。只有在加載(.NET)DLL時才執行函數的最佳方法?

基本上,我有幾個庫可以處理不同程序的各種任務 - 通知只是一個例子。

現在,我正在構建一個新程序,我希望它儘可能輕量級。雖然我想包括我的通知引擎,但我不認爲很多人會真正使用它的功能,所以,我寧願不包括它在默認情況下 - 就像可選下載一樣。

我該如何編程?

使用非託管Dll和P/Invoke,我基本上可以將所有內容包裝在try/catch循環中,但我不確定託管版本。

到目前爲止,我能想到的最好的方法是檢查啓動時是否存在DLL文件,然後設置一個字段布爾或類似的,每次我想要通知被解僱,我可以做一個if /檢查布爾和火...

我已經從調試窗口看到DLL文件只在需要的時候加載。程序顯然會編譯,因爲所有的組件都可以在項目中看到,但是它會運行在最終用戶沒有DLL的機器上嗎?

更重要的是,有沒有更好的方法來做到這一點?

我會理想地喜歡在我的應用程序中沒有關於通知的任何內容,並以某種方式擁有它,以便如果下載DLL文件,它會在外部添加此功能。真的不是世界末日有幾個額外的字節叫做notification("blabla");(或類似的),但是當我有更大的意圖,並且只想知道這種事情的最佳實踐時,我正在考慮更進一步。

回答

2

您可以使用System.Reflection.Assembly及其LoadFile方法來動態加載DLL。然後,您可以使用Assembly中的方法來獲取DLL中嵌入的類,類型等並調用它們。

如果你只是檢查.dll是否存在或加載插件目錄中的每個.dll,你可以得到你想要的。

+0

細微的區別,但您也可以測試加載是否成功,而無需知道路徑。組件綁定配置可以用來控制例如沒有程序需要知道名稱解析如何工作的插件目錄的位置。換句話說,代碼應該對實際的物理彙編文件不可知。 – harpo 2011-02-26 23:55:26

+0

我會看看System.Reflection.Assembly - 謝謝.... ...編輯你的答案的空白,因爲它說我已經投了票,不會讓我投票...我認爲有關之前的停電。 – Wil 2011-02-27 00:52:48

1

對於你的問題,如果程序將在用戶的機器上運行,而沒有dll已經存在 - 是的,程序會運行。只要你不做任何需要運行時加載dll中定義的類的東西,如果dll從機器中缺失,這並不重要。對於你正在尋找的有關加載dll的方面,我認爲你很擅長使用某種配置和Reflection(直接或通過一些IoC策略)。

0

嘗試在啓動時加載插件。

您可以爲通知創建委託字段,並將其初始化爲無操作函數,而不是遍佈整個地方檢查布爾值。如果加載插件成功,則將代理分配給插件實現。然後,事件發生的任何地方都可以調用委託,而不必擔心插件可能或不可用。

4

我想沒有多少人會 實際使用它的功能,所以,我 寧願不默認 包括它 - 只是作爲一個可選下載。

這樣的事情通常被描述爲插件(或附件或擴展)。

從.NET 4開始,標準的做法是使用Managed Exensibility Framework。它作爲System.ComponentModel.Composition程序集和命名空間包含在框架中。要開始使用,最好閱讀MSDN articleMEF programming guide

+0

我只有最近(最近兩個月)進入嚴重的c#開發,有關於MEF的會談我是一個用戶組的成員...我只是希望我在進行嚴肅的編程時,因爲它完全超越了我的頭 - 我不知道這是怎麼回事......在寫完這個問題之後,我突然想到了如何編寫一箇中間人類型的擴展程序,它能以我想要的方式工作......但是,我一定會看看MEF看看它是否能夠首先滿足我的需求(如果它不復雜......我還是很新的!) – Wil 2011-02-27 00:50:41

相關問題