2011-11-09 43 views
2

我使用Visual Studio 2010和C#來構建應用程序的WinForms和類庫。我有一些用於所有產品的公共庫,然後是我的應用程序的一些產品特定庫。我的組件都沒有GAC'd。所有項目將其輸出從各自的bin \ Debug文件夾複製到一個公用的Repository文件夾,並且所有組件引用都指向該Repository文件夾。Visual Studio 2010的大會參考文檔

例如,Common.DAL.dll,Common.BLL.dll,Product.DAL.dll,Product.BLL和Product.exe

組件之間的引用通常是這樣的:

  • Product.exe包括提及Product.BLL
  • Product.BLL包括到Common.BLL和Product.DAL引用
  • Product.DAL包括提及Common.DAL
  • 通訊on.BLL包括當所有這些都包含在同一個解決方案refrence到Common.DAL

,構建depencies是這樣的:

  • Common.BLL取決於Common.DAL
  • Product.DAL取決於Common.DAL
  • Product.BLL取決於Common.BLL和Product.DAL
  • Product.exe取決於Product.BLL

這使得構建順序是這樣的:

  1. Common.DAL
  2. Common.BLL
  3. Product.DAL
  4. Product.BLL
  5. Product.exe

通常情況下,試圖運行一個應用程序時,我得到以下錯誤:

無法加載文件或程序集「Common.DAL,版本= 1.0.0.0,文化=中性公鑰= 4e5249f2e70e1da8」或它的一個依賴。該系統找不到指定的文件。

我已經查明問題到一個事實,即在Product.exe的bin \ Debug文件夾不是所有的解決方案建立在組件結束。

如果我清潔解決方案,然後重建它,文件顯示是這樣的:

  • Common.DAL \ BIN \調試包含Common.DAL.dll
  • Common.BLL \ BIN \調試包含Common.BLL.dll和Common.DAL.dll
  • Product.DAL \ bin \ Debug包含Common.DAL.dll和Product.DAL.dll
  • Product.BLL \ bin \ Debug包含Common.BLL。 dll,Common.DAL.dll, Product.BLL.dll和Product.DAL。dll的
  • 但Product.exe \ BIN \調試只包含Product.exe,Product.BLL和 Product.DAL。 它缺少公共程序集。所以當我運行 Product.exe時,出現上面列出的錯誤。

我檢查了我所有的項目和屬性的屬性。它們都使用.NET Framework 4.對我的程序集的所有引用都將「特定版本」屬性設置爲false,並將「複製本地」屬性設置爲true。

我可以缺少的組件,以通過增加在Product.exe項目共同組件引用複製到Product.exe \ BIN \調試,但由於Product.exe不明確使用常見的組件,這感覺更像是一個混亂而不是解決方案。

我已經通過MSDN和Visual Studio文檔看了看,如果我能找出什麼影響或影響引用的程序集的拷貝,我已經如此搜查了類似的問題,但我還沒有發現任何有用的。

我在爲去哪裏或下一步要做什麼損失。

+3

爲什麼你不希望使用項目參考?如果你到處使用項目引用,你是否仍然有這個問題? – McKay

+0

我們在少數幾個項目中遇到過這種情況,最終以「copylocal = true」引用了最上面程序集(* .exe或網站)中的所有程序集。這是一種解決方法,我也想知道這種行爲的真正原因是什麼。 –

+0

@McKay,當項目全部存在於同一個解決方案中時,項目引用纔是有效的。很多時候,所有的項目都不會採用相同的解決方案。 Common.DAL和Common.BLL程序集通常不在Product.exe解決方案中,甚至Product.DAL和Product.BLL項目也不一定必須位於Product.exe解決方案中。 –

回答

3

在你的問題你說:

I can force the missing assemblies to be copied to Product.exe\bin\Debug by adding references to the Common assemblies in the Product.exe project, but since Product.exe doesn't explicitly use the Common assemblies, this feels more like a kludge than a solution.

我不認爲我同意。這並不完美,但Visual Studio有時甚至需要內部解決方案。這取決於你如何使用課堂。

雖然你可能認爲這是一個小雜牌,好像你的其他(我敢說「缺憾」)的要求(每一個解決方案項目)使事情似乎缺憾

+0

好吧,不管與否,我必須回答這個問題,因爲它對我們的開發過程影響最小。我們無法重新構建我們正在開發和維護的構建流程和所有項目和解決方案。感謝您的反饋。 =) –

2

您應該只參考裸組件的時候都相對穩定,外解決方案的

在您的解決方案中,從項目選項卡中引用它們。這將使VS在項目之間配置正確的依賴關係和構建順序。

在當前設置,覈實項目的依賴關係(解決方案|屬性)。

+0

我不同意。如果我這樣做了,那麼無論何時我將任何項目添加到解決方案中,我都需要添加_that_項目引用的所有項目,或將所有項目引用更改爲新位置。如果我在Repository文件夾中對所有程序集進行了引用,則無需更改它們,無論它們包含哪個解決方案。 –

+0

我會在此處與Henk一起去。如果你有很多解決方案都被劃掉了,你有什麼是意大利麪條建築。如果在很多解決方案中有很多項目涉及引用項目:或許是時候考慮製作一些接口DLL並完全複製下面的複雜實現。使邏輯組件與它們之間的接口。 – zmilojko

+0

@zmilojko,我不太確定我是否遵循。你是說如果我引用一個程序集來引用另外5個程序集,我應該總是在我的解決方案中包含那5個其他程序集?那些程序集中的任何程序集都引用了什麼? –