Ссылка на условный проект Visual Studio на основе константы

Для авторизации пользователей я хочу только указать конкретный модуль для каждого пользователя. Поэтому я сконфигурировал условную компиляцию, подобную этой

<DefineConstants>TRACE;DEBUG;SAMPLECONSTANT1</DefineConstants>

и отредактировал файл проекта следующим образом:

<ProjectReference Include="..\Solution1.Modules.Module1\Solution1.Modules.Module1.csproj" Condition="$(DefineConstants.Contains('SAMPLECONSTANT1'))">
  <Project>{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}</Project>
  <Name>Solution1.Modules.Module1</Name>
</ProjectReference>

В этом случае я хочу добавить ссылку на проект Module1, если DefineConstants содержит SAMPLECONSTANT1; но независимо от того, что я положил в DefineConstants, решение всегда загружает проект Module1. Что я сделал здесь неправильно?

ОБНОВЛЕНИЕ: На самом деле мой код верен. См. Ответ J0e3gan. Пользовательский интерфейс Visual Studio не отражает условные ссылки в папке References проекта. Поэтому все ссылки видны в любой заданной конфигурации или выборе платформы. С другой стороны, компилятор и IntelliSense знают об условных ссылках, соблюдая правильные настройки как с визуальной обратной связью, так и с уведомлением об ошибках во время сборки.

Ответ 1

Я подозреваю, что проблема заключается в том, что вы настраиваете ссылку на проект на Module1, а не на включение Module1 в решение.

Включение проекта в решение (и, следовательно, загрузка его с помощью решения) и проект, ссылающийся на другой проект в решении, - это, конечно, две разные вещи.

UPDATE:

Если вы действительно хотите уточнить ссылку на проект, Joe Wrobel написал связанный пост в блоге, который должен помочь. Ключевым выводом является обертка ItemGroup, которая содержит условие ProjectReference в элементе Choose - например:

<Choose>
  <When Condition="$(DefineConstants.Contains('SAMPLECONSTANT1'))">
    <ItemGroup>
      <ProjectReference Include="..\Solution1.Modules.Module1\Solution1.Modules.Module1.csproj">
        <Project>{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}</Project>
        <Name>Solution1.Modules.Module1</Name>
      </ProjectReference>
      <!-- other ProjectReference elements -->
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <!-- other ProjectReference elements -->
    </ItemGroup>
  </Otherwise>
</Choose>

Из моих тестов этим вечером это отлично работает, чтобы определить ссылку на проект о том, определена ли константа как SAMPLECONSTANT1. Обратите внимание, что условные ссылки проекта не отображаются в Обозревателе решений в (потенциальной) ссылке на справочную папку проекта - независимо от того, определена ли константа кондиционирования.

Чтобы убедиться, что работа по настройке работала, мне пришлось построить: с SAMPLECONSTANT1, проект успешно создан при использовании класса, определенного в Module1 - как и ожидалось; и без SAMPLECONSTANT1, проект ссылки не смог построить, потому что класс, определенный в Module1, не мог быть разрешен - также как и ожидалось.