Условные ссылки в проекте .NET, можно ли избавиться от предупреждения?

У меня есть две ссылки на сборку SQLite, одна для 32-битной и одна для 64-битной, которая выглядит так (это тестовый проект, чтобы попытаться избавиться от предупреждения, не зацикливайтесь на путях) :

<Reference Condition=" '$(Platform)' == 'x64' " Include="System.Data.SQLite, Version=1.0.61.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64">
  <SpecificVersion>True</SpecificVersion>
  <HintPath>..\..\LVK Libraries\SQLite3\version_1.0.65.0\64-bit\System.Data.SQLite.DLL</HintPath>
</Reference>
<Reference Condition=" '$(Platform)' == 'x86' " Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
  <SpecificVersion>True</SpecificVersion>
  <HintPath>..\..\LVK Libraries\SQLite3\version_1.0.65.0\32-bit\System.Data.SQLite.DLL</HintPath>
</Reference>

Это вызывает следующее предупреждение:

Warning 1 The referenced component 'System.Data.SQLite' could not be found.     

Могу ли я избавиться от этого предупреждения?

Я смотрел на это, чтобы просто настроить мой проект как 32-разрядный при разработке и позволить машине сборки исправить ссылку при сборке для 64-разрядной версии, но это кажется немного неудобным и, вероятно, подверженным ошибкам.

Есть другие варианты?

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


Изменить. Согласно ответу, я пробовал это:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    ...
    <SqlitePath>..\..\LVK Libraries\SQLite3\version_1.0.65.0\32-bit</SqlitePath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    ...
    <SqlitePath>..\..\LVK Libraries\SQLite3\version_1.0.65.0\32-bit</SqlitePath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
    ...
    <SqlitePath>..\..\LVK Libraries\SQLite3\version_1.0.65.0\64-bit</SqlitePath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
    ...
    <SqlitePath>..\..\LVK Libraries\SQLite3\version_1.0.65.0\64-bit</SqlitePath>
</PropertyGroup>

а затем в моей ссылке:

<Reference Include="System.Data.SQLite">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>$(SqlitePath)\System.Data.SQLite.DLL</HintPath>
</Reference>

Это избавило от предупреждения, но правильно ли оно?


person Lasse V. Karlsen    schedule 06.04.2010    source источник


Ответы (2)


Если для SQL Lite нет сборки AnyCPU, вы застряли с отдельными сборками.

Чтобы выполнить отдельные сборки, создайте свойство, которое задает правильный путь в группе условных свойств, а затем используйте это свойство для получения единственной ссылки (т. Е. Переместите условное выражение за пределы группы элементов ссылок). Вот пример использования такого свойства (для настраиваемого расширения FXCop) здесь, вы можете увидеть множество условных свойств, определенных в начале .csproj файл.

(Резюме: VS не поддерживает все возможности MSBuild.)

person Richard    schedule 06.04.2010
comment
Я отредактировал свой ответ, указав то, что считаю правильным. Можете ли вы взглянуть на него и сказать, что вы имели в виду? - person Lasse V. Karlsen; 06.04.2010

Насколько я понимаю, проблема с вашим исходным проектом заключалась в том, что вы указали <SpecificVersion>True</SpecificVersion> System.Data.SQLite, Version=1.0.61.0, тогда как фактическая сборка была версией 1.0.65. Исправление версии в имени сборки в Reference должно помочь.

person Anton Tykhyy    schedule 06.04.2010
comment
Хм, вы правы, хотя он выдает предупреждение как для x86, так и для x64, и одно из них, по-видимому, верное. Я разберусь с этим. - person Lasse V. Karlsen; 06.04.2010
comment
По-видимому, у меня проблема с файлами, в данном случае это был файл 1.0.61. Ссылка была добавлена ​​вручную через Visual Studio и поэтому должна быть правильной. Я исправлю файлы, но это не было причиной предупреждений. - person Lasse V. Karlsen; 06.04.2010
comment
Еще два предложения - ставьте Condition на ItemGroup, а не на сам Reference; попробуйте абсолютные пути. - person Anton Tykhyy; 06.04.2010
comment
Помещение Condition в ItemGroup не помогает, просто на случай, если кто-нибудь с этим столкнется. Visual Studio глупо думает, что у вас все еще есть ссылка на сборку, даже если ваше условие оценивается как ложное. - person Simon Brangwin; 24.07.2012