2008-09-26 59 views
13

剛纔我用MSBuild碰到了一個奇怪的情況。有一個解決方案有三個項目:LibX,LibY和Exe。 Exe引用LibX。 LibX反過來引用LibY,有一些內容文件,並且還引用了第三方庫(在GAC和本地lib文件夾中都安裝了幾個預構建的程序集)。第三方庫被標記爲「Copy Local」(「private」),並出現在LibX項目的輸出中,如LibY的輸出和LibX的內容文件所做的那樣。現在,Exe項目的輸出具有LibX項目輸出,LibX項目的內容文件,LibY項目輸出(來自LibX),但沒有第三方庫的程序集。MSBuild沒有拿起引用項目的參考

現在我通過直接在Exe項目中引用第三方庫來解決這個問題,但我不認爲這是一個「正確的」解決方案。

之前有人有過這個問題嗎?

+0

任何最終解決方案與完整的源代碼示例工作呢? – Kiquenet 2013-05-13 14:26:41

回答

2

是的,我也有這個問題。雖然我很想說另外,但我相信你必須在構建文件中包含所有傳遞依賴作爲參考。

4

實際上,您可以進入Microsoft.CSharp.targets或Microsoft.VisualBasic.targets文件(位於框架目錄中,通常爲C:\ Windows \ Microsoft.NET \ Framework \ v3.5)並修改csc或vbc任務參數以包含其他引用依賴項。在文件(VB目標,線166; C#的目標,線路164)的變化:\

References="@(ReferencePath)" 

References="@(ReferencePath);@(ReferenceDependencyPaths)" 

這可能會導致其他問題,取決於如何複雜的事情,它可能做手腳與Visual Studio inproc編譯器,但它是我發現的MSBuild中唯一的方法。

+0

這對我起初沒有任何影響,但後來我發現(至少在`Framework \ v4.0.30319`中)該行在每個`.targets`文件中出現兩次。 – CoderDennis 2012-10-04 15:15:53

12

與使用Visual Studio構建相比,使用MSBuild(即命令行,TFS構建和其他工具)構建時的行爲有所不同。次要引用不包含在發送到MSBuild編譯任務的引用變量中。

MSBuild提供了幾個擴展點來改變引用的解析方式。我已成功使用AfterResolveReference爲我的一些項目修復此問題 - I have posted more info about the background on my blog

解決方法是添加以下代碼到你vbproj或文件的csproj

<Target Name="AfterResolveReferences"> 
    <!-- Redefine referencepath to add dependencyies--> 
    <ItemGroup> 
    <ReferencePath Include="@(ReferenceDependencyPaths)"> 
    </ReferencePath> 
    </ItemGroup> 
    </Target> 

微軟曾表示,這是對Connect

+0

優秀。這實際上是針對該問題的更好解決方案。 – 2015-05-25 15:09:29

3

josant的答案几乎爲我工作;當我試圖在Visual Studio中不斷收到錯誤時:

嘗試爲IDE的進程內編譯器設置「References」參數時發生問題。錯誤HRESULT E_FAIL已從調用返回至COM組件

我的問題的解決方案是把一個條件上的ItemGroup,就像這樣:

<Target Name="AfterResolveReferences"> 
    <!-- Redefine referencepath to add dependencies--> 
    <ItemGroup Condition=" '$(BuildingInsideVisualStudio)' != 'true' "> 
    <ReferencePath Include="@(ReferenceDependencyPaths)"></ReferencePath> 
    </ItemGroup> 
</Target> 

導致Visual Studio來忽略參考完全改變,並且構建在本地和構建服務器上正常工作。