好的,所以我有一個使用插件的.NET項目。這些插件被實現爲類庫(DLL)項目,每個項目都建立在它們自己的文件夾中。主項目不需要運行插件DLL,但如果它們可用,它們將用於各種可選功能。來自插件的類由Type.GetType()
加載。但是,在測試軟件時,爲了我自己的目的,我希望能夠同時開發插件和主應用程序。我創建了一個引用所有項目的「主」解決方案文件,因此我可以設置斷點並跨越裝配邊界跨步。然而,問題是插件建立到他們自己的目錄中,所以我不得不以某種方式將插件DLL文件放在某處,其中Type.GetType()
可以找到它們。我應該如何「可選地」在另一個.NET項目中引用一個類庫項目?
編輯:爲了澄清,我的代碼已經列舉了同一個目錄中的.exe DLL文件和(使用Assembly.LoadFile()
,Assembly.GetExportedTypes()
和Type.IsAssignableFrom()
)查找匹配給定的接口的類。然後用戶選擇插件啓用,並使用Type.AssemblyQualifiedName
將這些選擇保存到數據庫。最後,當我需要使用插件提供的功能時,我使用Type.GetType()
加載插件類。所有這些完全按照預期工作。只是當我構建應用程序時,我得到了一個沒有插件的.exe副本。我正在尋找一種方法來構建項目和解決方案文件,以便我可以將主應用程序和插件項目分開,同時仍然可以在Visual Studio中一起調試它們。那有意義嗎?
到目前爲止,這些都是我的想法:
到插件項目添加從主體工程引用。
這樣做的好處是它可以在我的調試環境中按照預期工作,但是當我的應用程序部署時沒有插件時會導致問題嗎?我使用Dependency Walker進行了檢查,似乎沒有任何由項目引用創建的直接DLL依賴項。這裏有什麼隱藏的問題要知道嗎?更改所有要構建到相同目標目錄的插件項目。
這似乎工作得不錯,但它也混淆了我的構建樹,並且它會使開發一個項目時沒有簽出其他項目(現在它們都是Subversion中的所有兄弟文件夾)更困難。添加後期構建腳本以將插件複製到另一個目錄。
這實際上是我現在正在做的,它運作得很好,但它似乎非常駭人而脆弱。我想切換到另一種方法。找到一種方法爲
Type.GetType()
搜索其他目錄中的DLL
這是類似我如何在Unix系統上使用LD_LIBRARY_PATH
。顯然,我只想爲Debug版本啓用此功能,因爲在發佈模式下,這可能會在用戶系統上導致大量細微問題。但這甚至可能嗎?如果是這樣,怎麼樣?
有趣的是,在this tutorial關於這個問題,它說:
做的第一件事是參考我們剛剛創建的類庫,並設置生成輸出到同一目錄。
這對我來說似乎並不理想。有沒有更好的辦法?
在GAC中註冊他們? – 2009-08-05 19:33:28