簡體   English   中英

構建Visual Studio項目而無需訪問引用的dll

[英]Build a Visual Studio Project without access to referenced dlls

我有一個項目,它有一組二進制依賴項(程序集dll,我沒有源代碼)。 在運行時,需要在機器上預安裝這些依賴項,並且在編譯時,它們在源代碼樹中是必需的,例如在lib文件夾中。 由於我還為此程序提供了源代碼,因此我想為其啟用簡單的下載和構建體驗。 不幸的是,我不能重新分配dll,這使事情變得復雜,因為VS不會在沒有訪問引用的dll的情況下鏈接項目。

反正是否有能夠在沒有真正引用的dll的情況下構建和鏈接這個項目?

也許這是一種告訴VS鏈接自動生成的dll存根的方法,以便它可以在沒有原始的情況下重建? 也許有第三方工具可以做到這一點? 這個領域有任何線索或最佳實踐嗎?

我意識到這個人必須有權訪問dll才能運行代碼,所以他可以將它們添加到構建過程中,但我只是想讓他們省去收集所有dll並將它們放入其中的痛苦。 lib文件夾手動。

也許其中一個想法可以幫助您解決問題:

  • 從第三方dll中的所有類派生接口。 將這些接口放入自己的項目(相同的解決方案)並添加對此接口程序集的引用。 還要向AppDomain.AssemblyResolve添加一個EventHandler,並嘗試在運行時查找並加載程序集。 (學分歸NG)
    • 根據dll的大小以及對公共部分進行更改的頻率,這可能會產生真正的痛苦。
  • 提供readme.txt,您可以在其中解釋如何獲取所需的程序集以及用戶應將它們放在項目路徑中的位置。 通常情況下,VS非常智能,可以在將程序集放入項目引用它的正確位置后立即刪除感嘆號(可能您必須在解決方案資源管理器中按刷新)(致記者轉到Paul)
    • 不要忘記通過右鍵單擊解決方案並選擇“添加 - >現有項目”,將readme.txt添加到您的解決方案中 在這種情況下,它將在visual studio Solution Explorer中獲得一個非常突出的位置,用戶可以通過雙擊來讀取它。
  • 在您的解決方案中創建另一個項目,該項目能夠自動下載所有需要的dll並將它們放入正確的位置。 也許它應該在開始下載之前檢查這些所需文件是否已經存在。 設置原始項目的項目依賴項,以便它依賴於此項目。 因此它將始終在原始版本之前構建。 然后在原始項目的預構建事件中啟動此下載幫助工具,不要忘記使用int值退出程序。 0表示成功,任何其他錯誤,因此Visual Studio也知道您的工具是否成功並在掛起缺少的dll之前停止編譯過程。
    • 也許幾乎不可能自動下載文件,因為你需要登錄網頁或使用一些工具無法自動化的cookie,flash,驗證碼等。

對於上述所有好的建議,同意了。 話雖這么說,也許有一個有效的場景,通常不需要外部DLL? 所以這就是你做的。 你包裝並隔離它們。 (它比創建接口更高級別的抽象,因此更容易維護)。

在Visual Studio中,如果您不重新編譯引用外部DLL的特定VS項目,那么您可以在不使用這些DLL的情況下編譯VS解決方案項目的其余部分。 因此,如果您以某種方式用您自己的DLL包裝外部DLL,然后將這些包裝器僅作為二進制文件分發,則共享源代碼的人將不需要外部DLL來編譯主解決方案。

注意事項 :1。將包裝器代碼分離為獨立項目的額外工作。 2.其他VS Projects必須添加對包裝器DLL的引用,作為“文件系統”引用“LIB”文件夾,而不是“項目引用”。 3. VS Solution配置必須禁用包裝器DLL的編譯。 如果需要,應添加新配置以明確重新編譯它們。 4.每個Wrapper DLL的VS Project定義應包括一個構建后事件,以將它們復制到預期的“LIB”文件夾位置。 5.在運行時,外部DLL必須存在於應用程序的bin目錄或計算機的GAC中,否則必須明確加載。 注意:如果缺少它們,則只有當它們在運行時實際調用時,它們的缺失才會導致運行時錯誤。 即如果代碼在一般情況下沒有調用它們,則不需要它們。 6.在運行時,您可以捕獲加載外部DLL的錯誤,並向用戶顯示一條漂亮的錯誤消息,說“為了使用此功能,請安裝以下產品:xyz”。 這比顯示“AssemblyLoadException ...請使用FusionLogViewer等”更好.7。在應用程序啟動時,您可以測試和檢測丟失的DLL,然后禁用依賴於它們的特定功能。

例如:根據這種模式,我可以有一個與Microsoft CRM和SAP集成的應用程序,但僅適用於特定功能,即導入/導出。
在設計時,如果開發人員不需要更改包裝器,他們將能夠在沒有這些外部DLL的情況下重新編譯。 在運行時,如果用戶從不調用此函數,則應用程序將永遠不會調用包裝器,因此不需要外部DLL。

好吧,拯救他們收集所有程序集的痛苦,並自己將它們放在lib文件夾中。 然后將它們與存儲庫中的源代碼一起提交。 這樣,人們從存儲庫中檢出代碼也將獲得編譯項目所需的一切。

一個相當大的可能性是使用分離的接口模式並在運行時以編程方式加載dll。

我寧願讓編譯時依賴性失敗我的構建而不是運行時錯誤可能需要一些時間來追蹤。

在解決方案中放置一個Readme.txt,明確說明依賴性是什么,在哪里獲取它們,以及如何處理它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM