Предупреждение: обнаружены конфликты между различными версиями одной и той же зависимой сборки

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

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

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

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

Ответ 1

Это предупреждение означает, что два проекта ссылаются на одну и ту же сборку (например, 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
  • Еще один простой метод - установить подробность вывода "Построить" ("Инструменты", "Опции", "Проекты и решения", "Построить и запустить", "Детализация вывода при сборке проекта MSBuild", "Подробно") и после сборки найдите в окне вывода предупреждение и посмотрите на текст чуть выше него., (Шляпа подсказка для pauloya, кто предложил это в комментариях к этому ответу).

Ответ 2

В основном это происходит, когда на собраниях, на которые вы ссылаетесь, есть "Копировать локальную", установленную в "True", что означает, что копия DLL помещается в папку bin вместе с вашим exe.

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

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

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

Ответ 3

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

Самый простой способ найти, что такое "оскорбительная ссылка (ы)", - это set Build output verbosity (Инструменты, опции, проекты и решения, Build и 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.

Ответ 4

У меня была одна и та же проблема с одним из моих проектов, однако ни одно из перечисленных выше не помогло решить проблему. Я проверил подробный файл журнала сборки, я использовал 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)

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

Ответ 5

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

Ответ 6

Я только что получил это предупреждение и очистил решение и перекомпилировал (Build → Clean Solution), и он ушел.

Ответ 7

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

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

From:

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

To:

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

Ответ 8

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

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

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

Ответ 9

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

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

  • Из Обозревателя решений щелкните правой кнопкой мыши проект и выберите "Управление Пакеты Nuget

  • Выберите вкладку "Установленные пакеты" на левой панели. Запишите установленную   пакетов. Вы можете скопировать файл packages.config на свой   прежде всего, если у вас много, поэтому вы можете перекрестно проверить его с помощью   Google, чтобы узнать, какие пакеты Nuget установлены

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

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

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

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

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

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

Ответ 10

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

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

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

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

Ответ 11

Также возникла эта проблема - в моем случае это было вызвано наличием свойства "Специфическая версия" в количестве ссылок, установленном в true. Изменение этого параметра на false в этих ссылках разрешило проблему.

Ответ 12

При использовании NuGet все, что мне нужно было сделать, это:

  1. щелкните правой кнопкой мыши проект и выберите Управление пакетами NuGet.

  2. нажмите на винтик в правом верхнем углу

  3. щелкните вкладку Общие в диспетчере пакетов NuGet над источниками пакетов

  4. установите флажок "Пропустить применение перенаправлений привязки" в разделе "Переадресация привязок".

  5. Очистить и восстановить и предупреждение ушло

Очень просто

Ответ 13

Это случилось со мной. Одна dll была указана дважды: один раз напрямую (в ссылках) и один раз косвенно (ссылка на другой ссылочный проект). Я удалил прямую ссылку, очистил и перестроил решение. Проблема исправлена.

Ответ 14

  • Откройте "Обозреватель решений".
  • Нажмите "Показать все файлы"
  • Развернуть "Ссылки"
  • Вы увидите одну (или более) ссылку с немного отличающимся значком, чем остальные. Как правило, это желтая коробка, предлагающая вам принять к сведению ее. Просто удалите его.
  • Добавьте ссылку назад и скомпилируйте свой код.
  • Что все.

В моем случае возникла проблема с ссылкой MySQL. Так или иначе, я мог бы перечислить три версии этого списка в списке всех доступных ссылок; для .net 2.0,.net 4.0 и .net 4.5. Я следовал за процессом с 1 по 6 выше, и это сработало для меня.

Ответ 15

Еще одна вещь, которую нужно рассмотреть и проверить: убедитесь, что у вас нет службы, использующей эту папку bin. если они останавливают сервис и восстанавливают решение

Ответ 16

Кажется, есть проблема в Mac Visual Studio при редактировании файлов .resx. Я действительно не знаю, что случилось, но у меня возникла эта проблема, как только я отредактировал некоторые файлы .resx на моем Mac. Я открыл проект в Windows, открыл файлы, и они были, как будто они не были отредактированы. Поэтому я отредактировал их, сохранил, и все снова начало работать на Mac.

Ответ 17

У меня была такая проблема, когда в моем проекте была ссылка на NETStandardLibrary, и одна из сборок, на которые есть ссылки, была опубликована для netcore. Просто опубликовал его как netstandard и проблема исчезла

Ответ 18

Я просто потратил некоторое время на устранение той же проблемы. Обратите внимание, что проблема может быть не между разными проектами, а на самом деле между несколькими ссылками в одном проекте, которые зависят от разных версий одной и той же библиотеки/сборки. В моем случае проблема заключалась в несовпадении эталонных версий FastMember.dll, которое происходит из двух разных пакетов NuGet в одном проекте. Когда мне дали проект, он не скомпилировался, потому что пакеты NuGet отсутствовали, а VS отказался восстанавливать отсутствующие пакеты. Через меню NuGet я вручную обновляю все NuGets до последней версии, то есть когда появилось предупреждение.

В Visual Studio Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics. Найдите строку (и) There was a conflict between в окне Output. Ниже приведена часть вывода, который я получил:

1>  There was a conflict between "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null". (TaskId:19)
1>      "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" was not. (TaskId:19)
1>      References which depend on "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" [C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll]. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll". (TaskId:19)
1>              FastMember, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
1>      References which depend on "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" []. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll". (TaskId:19)
1>              ClosedXML, Version=0.94.2.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)

Обратите внимание, что Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll"

ClosedXML.dll исходит от ClosedXML NuGet и зависит от FastMember.dll 1.3.0.0. Помимо этого, в проекте также есть FastMember Nuget, и у него есть FastMember.dll 1.5.0.0. Несоответствие !

Я удалил ClosedXML & FastMember NuGets, потому что у меня было перенаправление привязки и я установил только последнюю версию ClosedXML, которая исправила проблему!

Ответ 19

Вот решение, стиль .NET Core 3.0: https://github.com/HTD/ref-check

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

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