Предупреждение. Обнаружены конфликты между разными версиями одной и той же зависимой сборки. - PullRequest
307 голосов
/ 20 августа 2008

В настоящее время я занимаюсь разработкой приложения .NET, которое состоит из 20 проектов. Некоторые из этих проектов скомпилированы с использованием .NET 3.5, другие все еще являются проектами .NET 2.0 (пока проблем нет).

Проблема в том, что если я включаю внешний компонент, я всегда получаю следующее предупреждение:

"Found conflicts between different versions of the same dependent assembly".

Что именно означает это предупреждение, и есть ли возможность исключить это предупреждение (например, используя #pragma disable в файлах исходного кода)?

Ответы [ 17 ]

392 голосов
/ 26 января 2010

Это предупреждение означает, что два проекта ссылаются на одну и ту же сборку (например, System.Windows.Forms), но для двух проектов требуются разные версии. У вас есть несколько вариантов:

  1. Перекомпилируйте все проекты для использования одинаковых версий (например, переместите все в .Net 3.5). Это предпочтительный вариант, поскольку весь код выполняется с версиями зависимостей, с которыми они были скомпилированы.

  2. Добавить перенаправление привязки . Это подавит предупреждение. Однако ваши проекты .Net 2.0 будут (во время выполнения) связаны с версиями .Net 3.5 зависимых сборок, таких как System.Windows.Forms. Вы можете быстро добавить перенаправление привязки, дважды щелкнув по ошибке в Visual Studio.

  3. Использовать CopyLocal=true. Я не уверен, что это подавит предупреждение. Это, как и вариант 2 выше, будет означать, что все проекты будут использовать .Net 3.5 версию System.Windows.Forms.

Вот несколько способов идентифицировать оскорбительные ссылки:

  • Вы можете использовать утилиту, такую ​​как найденная на https://gist.github.com/1553265
  • Другой простой способ - установить Build. подробность вывода (Инструменты, Опции, Проекты и Решения, Построить и Выполнить, подробность сборки проекта MSBuild, Подробно) и после построение, найдите в окне вывода предупреждение и посмотрите на текст прямо над ним. (Шляпа подсказка pauloya , который предложил это в комментарии к этому ответу) .
42 голосов
/ 20 августа 2008

Обычно это происходит, когда для сборок, на которые вы ссылаетесь, для параметра «Копировать локальный» установлено значение «Истина», что означает, что копия библиотеки DLL помещается в папку bin вместе с вашим файлом exe.

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

Способ, который я нашел, - установить для параметра «Локальное копирование» значение «Ложь» для ссылок в проектах сборки. Делайте это только для исполняемых файлов / веб-приложений, где требуется сборка для запуска готового продукта.

Надеюсь, что это имеет смысл!

30 голосов
/ 10 ноября 2015

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

Самый простой способ найти «оскорбительные ссылки» - это установить подробность вывода Build (Инструменты, Опции, Проекты и Решения, Build and Run, подробность сборки проекта MSBuild, подробная информация) и после сборки найдите в окне вывода предупреждение. См текст прямо над ним.

Например, при поиске на панели вывода «конфликта» вы можете найти что-то вроде этого:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

Как вы видите, существует конфликт между версиями EF 5 и 6.

21 голосов
/ 09 ноября 2012

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

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

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

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

13 голосов
/ 30 сентября 2016

В Visual Studio, если вы щелкнете правой кнопкой мыши по решению и Управление пакетами nuget есть вкладка "Консолидация" , которая устанавливает все пакеты в одну и ту же версию .

8 голосов
/ 17 января 2012

Я только что получил это предупреждающее сообщение, очистил решение и перекомпилировал (Построить -> Очистить решение), и оно ушло.

6 голосов
/ 13 июля 2014

У меня была та же проблема, и я решил, изменив следующее в web.config.

Это случилось со мной, потому что я запускаю приложение, используя Newtonsoft.Json 4.0

От:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>

Кому:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
2 голосов
/ 18 апреля 2017

=> проверьте, что какой-то экземпляр приложения будет установлен частично.

=> прежде всего удалите этот экземпляр из приложения удаления.

=> затем очистите, перестройте и попробуйте развернуть.

это решило мою проблему. Надеюсь, вам это тоже поможет. С наилучшими пожеланиями.

2 голосов
/ 09 апреля 2014

У меня есть другой способ сделать это, если вы используете Nuget для управления своими зависимостями. Я обнаружил, что иногда VS и Nuget не совпадают, и Nuget не может распознать, что ваши проекты не синхронизированы. Packages.config скажет одно, а путь, указанный в References - Properties, укажет другое.

Если вы хотите обновить свои зависимости, сделайте следующее:

  1. В обозревателе решений щелкните правой кнопкой мыши проект и выберите «Управление». Nuget Packages '

  2. Выберите вкладку «Установленные пакеты» в левой панели. Запишите установленные пакеты Вы можете скопировать ваш файл packages.config в свой сначала рабочий стол, если у вас много, так что вы можете проверить это с Google, чтобы увидеть, какие Nuget pkgs установлены

  3. Удалите ваши пакеты. Все в порядке, мы собираемся добавить их обратно.

  4. Немедленно установите нужные вам пакеты. Что Nuget сделает, так это не только предоставит вам последнюю версию, но и изменит ваши ссылки, а также добавит для вас перенаправления привязки.

  5. Сделайте это для всех ваших проектов.

  6. На уровне решения выполните очистку и восстановление.

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

Если вы не хотите обновлять свои зависимости, вы можете использовать консоль диспетчера пакетов и использовать синтаксис Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]

2 голосов
/ 20 августа 2008

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

Это иногда происходит, когда вы используете "Обзор", чтобы найти ссылки и добавить неверную версию сборки, или у вас в репозитории кода другая версия компонента, чем та, которую вы установили на локальном компьютере.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...