2012-05-24 18 views
3

我想添加一個項目和文件引用到csproj與BuildingInVsideisualStudio屬性相同的dll。但是當它們一起在csproj中時,只有文件引用被拾取。如果我刪除文件引用,它會啓動csproj。我嘗試交換訂單,但沒有運氣。任何想法,爲什麼這不起作用?BuildingInsideVisualStudio屬性值不能使用文件引用和項目引用有條件

這裏的基本思想是:

<ItemGroup Condition="'$(BuildingInsideVisualStudio)' == false"> 
    <Reference Include="MyNamespace.Mine"> 
     <HintPath>..\$(OutDir)\MyNamespace.Mine.dll</HintPath> 
    </Reference> 
</ItemGroup> 
<ItemGroup Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> 
    <ProjectReference Include="..\MyNamespace.Mine.csproj"> 
     <Project>{GUID}</Project> 
     <Name>MyNamespace.Mine</Name> 
    </ProjectReference> 
</ItemGroup> 

Someone else已經沿着這條道路,太,但它似乎有some caveats。我需要這樣做,因爲我的構建過程無法更改。使用文件引用迫使我失去轉到定義和查找所有引用(對不起,但我無法安裝ReSharper來解決這個問題)。

回答

1

假設我在經過一番實驗後正確理解了這個問題,似乎以不同的方式命名它們可以解決大部分問題; msbuild會尊重條件並使用程序集引用,VS會在解決方案資源管理器中顯示它們,但會預編譯引用,就像它是項目類型一樣,並且會在沒有R#的情況下繼續執行goto-definition。有條件的導入是值得研究的東西,但我沒有嘗試過。

<ItemGroup> 
    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Condition="'$(Foo)'=='Bar1'"> 
     <Project>{FD0E01BC-7777-4620-9EF2-5F60804B3173}</Project> 
     <Name>ClassLibrary1-ProjRef</Name> 
    </ProjectReference> 
    <Reference Include="ClassLibrary1" Condition="'$(Foo)'=='Bar2'"> 
     <Name>ClassLibrary1-AssRef</Name> 
     <HintPath>..\ClassLibrary1\bin\Debug\ClassLibrary1.dll</HintPath> 
    </Reference> 
</ItemGroup> 
+0

工作。吮吸一點,該DLL仍然出現,但好處似乎超出了這一點。 – kevindaub

6

兩個問題我看到:

  1. 你沒有考慮到$(BuildingInsideVisualStudio)可以是空的('')。對於第一種情況使用:

    <ItemGroup Condition="'$(BuildingInsideVisualStudio)' != 'true'">

  2. 始終圍繞着兩個操作數用單引號:

    <ItemGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'">


MSDN reference:

簡單的字母數字字符串或 布爾值不需要單引號。 但是,空值需要單引號。


UPDATE:

可能是一個長鏡頭,但你可以嘗試使用的財產defintions條件:

<PropertyGroup Condition="'$(BuildingInsideVisualStudio)' != 'true'"><!-- In CMD --> 
    <ReferenceInclude>MyNamespace.Mine"</ReferenceInclude> 
    <ReferenceIncludePath>..\$(OutDir)\MyNamespace.Mine.dll</ReferenceIncludePath> 
</PropertyGroup> 
<PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'"><!-- In VS --> 
    <ProjectReferenceInclude>..\MyNamespace.Mine.csproj</ProjectReferenceInclude> 
    <ProjectReferenceIncludeId>{GUID}</ProjectReferenceIncludeId> 
</PropertyGroup> 

所以引用將獲得有條件解決:

<ItemGroup> 
    <Reference Include="$(ReferenceInclude)"> 
     <HintPath>$(ReferenceIncludePath)</HintPath> 
    </Reference> 
</ItemGroup> 
<ItemGroup> 
    <ProjectReference Include="$(ProjectReferenceInclude)"> 
     <Project>$(ProjectReferenceIncludeId)</Project> 
     <Name>%(ProjectReferenceInclude.MSBuildProjectName)</Name> 
    </ProjectReference> 
</ItemGroup> 
+0

我更新了我的csproj你的建議,但不幸的是我得到了相同的結果 – kevindaub

+0

看到我更新的答案,希望它有助於 – KMoraz

+0

不幸的是,我得到了相同的結果。 – kevindaub

0

r esponse Microsoft發佈到this關於Connect的問題表明Visual Studio故意忽略程序集引用或項目的條件。這是可以理解的;然而,當項目文件包含對相同程序集的多個引用時,解析過程似乎總是偏好基於文件的引用,這是沒有實際意義的。

總之,除非有辦法告訴VS考慮項目引用,即使文件引用出現在同一程序集中,也是如此。我不知道如何做到這一點,我也有興趣瞭解它是否仍然有可能。

+0

儘管我仍然相信這是VS/MSBuild中的一個錯誤,但我可以通過更改項目名稱來解決它。我認爲我不能分裂賞金。 – kevindaub

2

在Visual Studio 2010和2012中,您還可以使用Choose語句而不是添加帶條件的引用。這似乎是工作好了很多:

<Choose> 
    <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'"> 
    <ItemGroup> 
     <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> 
    </ItemGroup> 
    </When> 
    <Otherwise> 
    <ItemGroup> 
     <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" /> 
    </ItemGroup> 
    </Otherwise> 
</Choose> 
+0

添加差異引用不是問題。添加項目引用或dll引用是問題,但我會試一試。 – kevindaub

+1

我們現在在內部使用它,對我們來說它工作得很好。我們使用'$(BuildingInsideVisualStudio)'和'$(TeamBuildConstants)'變量來指導我們是基於Visual Studio,Team Build還是'其他'(命令行或其他) – jessehouwing

+0

你試過了嗎?因爲它實際上只會列出一次參考。 – jessehouwing