2009-06-16 44 views
10

當我構建一個包含2個項目B.csproj和C.csproj的A.sln時,它具有內部項目引用,它將引發MSBuild中的引用錯誤。但是當我在MSBuild中單獨構建B.csproj和C.csproj時,它不會拋出錯誤。而且在VS IDE中構建A.sln也不會引發錯誤。我使用的是.NET 2.0框架。請在下面找到用於構建sln和projs的腳本。MSBuild使用項目引用正確地構建項目,但不是從解決方案

MSBuild "<path>/A.sln" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\A.sln.log /verbosity:normal 

MSBuild "<path>/B.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\B.csproj.log /verbosity:normal 

MSBuild "<path>/C.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\C.csproj.log /verbosity:normal 

編輯:

所有拋出的錯誤是從失蹤refernces碼(全部爲項目引用)。我只得到三種類型的錯誤,如下所示。

錯誤CS0012:類型'X'在沒有引用的程序集中定義爲 。 您必須添加對組件 'Y,Version = 2.0.0.0,Culture = neutral, PublicKeyToken = aad4cbe5d7c27078'的引用。

錯誤CS0234:類型或命名空間 名「:類型或命名空間 名「X」並不在 命名空間「Y」(?是否缺少 集引用)

錯誤CS0246存在X」找不到(你 缺少using指令或 集引用?)

我清除從構建路徑之前所有的DLL構建從IDE和建設的MSBuild之前。但IDE工作正常,並且在項目的「Refrences」部分中未顯示缺少參考指標。

沒有在IDE中手動添加參考路徑。

另一個更新:

我注意到,當我從溶液中打開兩個項目,引用正確的IDE指向。但是當我在IDE中單獨打開這些項目時,我在MSBuild中提到的缺少的參考文件就出現了。非常奇怪。

所以總結一下,

Buiilding .proj中的MSBuild - 好

Buiilding .proj在IDE - 錯誤

Buiilding的.sln中的MSBuild - 錯誤

Buiilding的.sln在IDE中 - 好

搭配對我來說很奇怪。非常感謝。

+9

每當您提出問題並說出現錯誤時,確實有助於剪切並粘貼錯誤。這適用於異常,編譯器錯誤,編譯錯誤... – 2009-06-16 12:50:27

+0

順便說一句,如果它單獨構建兩個項目沒有問題,那麼我想知道兩個項目是否需要項目引用。 OTOH,這可能是因爲最近的功能允許MSBUILD對項目參考「聰明」。因爲我從來沒有理解過這個特徵,所以我不能排除這一點。但我建議您確認是否需要所有項目參考,以及重建B是否會導致重建C. – 2009-06-16 12:54:54

+0

@blntechie:感謝您的更新。我建議你使用Solution Explorer;按順序選擇每個引用,然後查看「屬性」窗口中的詳細信息。看到任何奇怪的東西,比如一個在obj中,另一個在bin中?另外,如果沒有參考路徑,那麼您可能不介意查看您的.csproj.user文件以確保它們確實沒有? – 2009-06-16 13:11:26

回答

8

MSBuild和VS都使用項目引用和項目依賴性來選擇解決方案構建順序。除此之外,它還沒有定義 - 兩者之間通常是不同的。檢查這兩個都是正確的。項目依賴性在解決方案的屬性中設置。 如果這不起作用,請仔細檢查項目中的項目引用中的GUID是否與解決方案中的GUID匹配。有時重新創建解決方案可以解決它們。

1

正如Jon Skeet所說,錯誤信息會有助於瞭解問題所在。但是,如果沒有任何細節,如果它構建在IDE中,但不構建在MSBuild中,則聽起來像您可能在您的項目中引用的DLL不在構建解決方案的路徑中可用。也許您手動將它們複製到IDE可以找到它們的位置,或者您在IDE中設置了參考路徑以查找某個文件夾。

只是要檢查,而你得到這些問題的其他細節。

編輯:現在有一些細節,它可能是一個構建問題的順序。項目B中有項目引用到項目C嗎?如果是這樣,你可能只需要更改順序的項目B之前建的項目C.

3

有些事情要考慮:建設中的IDE的解決方案是不一樣的.sln文件運行MSBUILD。您可以嘗試使用devenv.exe/rebuild A.sln。 IDE可以播放幾個遊戲來創建.sln文件,包括創建一個「等效」的MSBUILD風格的項目。

此外,IDE不會直接產生MSBUILD命令。兩者之間有交互以提高性能。例如,項目中的CSC任務可能在IDE內部執行,而不是作爲單獨的命令行構建,因爲MSBUILD會派生它們。

你也應該考慮以觀看正在被訪問的文件越來越進程監視器從http://technet.microsoft.com/sysinternals/

4

對我來說,當我有這個(或類似)的問題,手動檢查(和固定)的GUID排隊修復我的問題。追查.sln和.csproj文件之間的guid是很煩人的,但它起作用。

我通常刪除項目引用,並重新添加它,能解決問題(一旦我發現有問題的不匹配的GUID)。也許我應該先嚐試一下。這很容易。

1

從GAC刪除組件(C:\ WINDOWS \ assembly文件夾 - 選擇assebly並右鍵單擊和卸載)。

因爲解決方案保持基準使用GUID,如果該GUID是在GAC,它將繼續服用GAC版本編譯。

相關問題