Условные ссылки в .NET проекте, возможно ли избавиться от предупреждения? - PullRequest
21 голосов
/ 06 апреля 2010

У меня есть две ссылки на сборку 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>

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

Ответы [ 2 ]

8 голосов
/ 06 апреля 2010

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

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

(Резюме: VS не использует все возможности MSBuild.)

1 голос
/ 06 апреля 2010

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

...