2012-05-24 2 views
3

Я пытаюсь добавить ссылку на проект и файл в ту же DLL в csproj с свойством BuildingInVsideisualStudio. Но когда они находятся в 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. Мне нужно сделать это условно из-за моего процесса сборки, который не может измениться. Использование ссылки на файл заставляет меня потерять Go to Definition и Find All References (извините, но я не могу установить ReSharper для решения этой проблемы).

ответ

1

Предполагая, что я правильно понял вопрос после нескольких экспериментов, кажется, что их именование по-разному разрешит большинство проблем; msbuild будет уважать условие и использовать ссылку на сборку, VS отобразит их как в обозревателе решений, так и подготовит ссылку, как будто это тип проекта, и сохранит goto-definition без работы R #. Условный импорт - это еще что-то интересное, но я не пробовал.

<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:

Может быть длинный выстрел, но вы можете попробовать использовать условия на недвижимость определениях:

<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 вопрос о соединении, который указывает, что Visual Studio намеренно игнорирует условия для ссылок на сборки, проект или нет. Это понятно; Однако, процесс разрешения, кажется, всегда предпочитает ссылки на файл на основе, когда файл проект содержит более чем одну ссылки на ту же сборку, что спорный вопрос.

Короче говоря, вам не повезло, если нет способа сообщить VS рассмотреть ссылку на проект, даже если ссылка на файл присутствует в той же сборке. Я не знаю, как это сделать, и мне было бы интересно узнать, возможно ли это как-то.

+0

Хотя я все еще верю, что это ошибка в VS/MSBuild, я смог обойти это, изменив название проекта. Я не думаю, что могу разделить щедрость. – kevindaub

2

В Visual Studio 2010 и 2012 вы также можете использовать оператор Select вместо добавления ссылки с условием. Это, кажется, работает намного лучше:

<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