[英]Build a Visual Studio Project without access to referenced dlls
我有一個項目,它有一組二進制依賴項(程序集dll,我沒有源代碼)。 在運行時,需要在機器上預安裝這些依賴項,並且在編譯時,它們在源代碼樹中是必需的,例如在lib文件夾中。 由於我還為此程序提供了源代碼,因此我想為其啟用簡單的下載和構建體驗。 不幸的是,我不能重新分配dll,這使事情變得復雜,因為VS不會在沒有訪問引用的dll的情況下鏈接項目。
反正是否有能夠在沒有真正引用的dll的情況下構建和鏈接這個項目?
也許這是一種告訴VS鏈接自動生成的dll存根的方法,以便它可以在沒有原始的情況下重建? 也許有第三方工具可以做到這一點? 這個領域有任何線索或最佳實踐嗎?
我意識到這個人必須有權訪問dll才能運行代碼,所以他可以將它們添加到構建過程中,但我只是想讓他們省去收集所有dll並將它們放入其中的痛苦。 lib文件夾手動。
也許其中一個想法可以幫助您解決問題:
對於上述所有好的建議,同意了。 話雖這么說,也許有一個有效的場景,通常不需要外部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.