4

我有幾個不同的解決方案,其中一些項目可能依賴於其他解決方案中項目的輸出。爲了管理這個,我已經將每個項目中的/ bin /文件夾中的dll文件複製到共享庫位置,然後將它們從那裏複製/引用到依賴項目。將所有輸出dll放在Visual Studio的公共目錄中

但是,隨着圖書館解決方案變得越來越大,這往往變得無法維持。我的很多時間都是在Windows資源管理器中遍歷解決方案目錄,尋找/ bin /文件夾,並試圖找出每個我需要的dll文件中的哪一個或哪些文件。

有什麼辦法給Visual Studio一個提示,我想所有項目在一個解決方案有相同的輸出目錄嗎?例如,直接在解決方案文件夾下有一個/ bin /文件夾,其中全部爲項目放置其輸出。

如果可能的話,我想實現這一點,而不需要複製文件的硬編碼後構建事件,因爲如果項目輸出更改文件名或添加其他文件,則會失敗。如果願意,我想更改實際輸出目錄的位置 - $(OutDir)的位置。

回答

3

您可以在每個項目屬性中設置輸出目錄。

右鍵單擊該項目,選擇Properties

對於C#,它是Build屬性頁的一個,Output下,Output directory

在VB.Net項目中,它位於Compile選項卡上,位於頂部的文本框中。

+0

我的項目主要是VB.NET項目,所以屬性頁看起來不像C#項目。 – 2010-07-21 09:00:15

+1

反正找到了它=)但是,這是在項目級別上。如果兩個項目依賴於相同的第三方或第三方DLL,會發生什麼情況 - 它們是否會覆蓋,重命名或尖叫尋求幫助(即拋出異常)?我所追求的是 - 在解決方案層面上而不是在項目層面上有沒有辦法做到這一點? – 2010-07-21 09:04:30

+1

@Thomas - 是的,在項目層面。異常不會被拋出,通常依賴的dll將被覆蓋。這不是一個問題,因爲編譯項目是連續的。 – Oded 2010-07-21 09:10:12

7

我知道你說你不想使用發佈後的事件,但你的理由爲什麼不吸引我。這聽起來像你可能很難編寫您的後構建事件中的.dll的名稱。這很容易避免。

xcopy "$(TargetDir)*" "c:\common\" /Y

*只會導致一切在你的bin /調試/文件夾被複制到您的共同文件夾。如果你願意,你也可以複製dll。或者,如果您使用$(TargetPath),則只需複製項目結果的1個dll,而不是任何其他相關的依賴項。

UPDATE

我們這樣做的方式是整個bin文件夾複製到文件夾中每個項目。假設您有2個項目,WebUtilHtmlParser,其中WebUtil依賴於HtmlParser。對於這兩個項目,請使用xcopy "$(TargetDir)*" "c:\common\$(ProjectName)" /Y。這將創建c:\ common \ WebUtil \和c:\ common \ HtmlParser。在WebUtil中,添加對c:\ common \ HtmlParser \ HtmlParser.dll的引用。現在在c:\ common中會有2個HtmlParser.dll副本。

c:\ common \ HtmlParser \ HtmlParser.dll //最近的版本。 c:\ common \ WebUtil \ HtmlParser //什麼 WebUtil建成時的最新版本

這有各種優點。如果您更改HtmlParser的API,WebUtil將繼續工作,因爲它將具有較早的HtmlParser.dll,直到您嘗試重新構建WebUtil(此時由於更改後的API而會出現構建錯誤)。現在

,如果第三個項目在這取決於WebUtil混了,你正在使用WebUtil的某一部分暴露在HTMLParser的類,那麼你需要參考上增添您的項目新項目。當您添加對HtmlParser.dll的引用時,請使用c:\​​ common \ WebUtil中的引用。你這樣做是因爲你只是將它作爲WebUtil的一個必要條件來包含它。現在您將始終擁有與當前版本的WebUtil.dll相匹配的HtmlParser.dll版本。

我希望這是有道理的。這絕對是一個棘手的事情來管理。等到你必須開始使用svn拉下所有的依賴關係時:externals = P

+0

這仍然給我帶來兩個問題之一:或者(如果我從bin中複製所有東西)我冒着複製太多的風險並覆蓋其他項目的東西,或者(如果我只複製作爲項目結果的dll),我冒險結果在構建文件夾中太少,因爲需要的依賴關係可能被忽略。沒有中間路線嗎? – 2010-07-21 09:05:14

+1

+1這正是我所建議的。 @Tomas,你是否意識到你可以更仔細地過濾副本:'xcopy「$(TargetDir)*。dll」「c:\ common \」/ Y'只複製dll。如果沒有完全得到所有內容,那麼你可以添加另一個更具體的複製命令。這確實不是什麼麻煩事,只需幾分鐘的工作和一兩個測試版本,如果將正確的過濾應用到'xcopy',那麼它的維護也很少。 – slugster 2010-07-21 10:51:24

+0

@Tomas - 您可以使用[Robocopy](http://ss64.com/nt/robocopy.html),並使用排除/包含選項來解決這些情況。 – 2012-10-05 14:38:00

相關問題