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


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

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

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

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



Answers



Это предупреждение означает, что два проекта ссылаются на одну и ту же сборку (например, 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




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

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

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

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




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

Самый простой способ найти то, что является «оскорбительной ссылкой (-ами)», - это установить многословность сборки (инструменты, параметры, проекты и решения, сборку и запуск, многостраничную сборку проекта для сборки 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.

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




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

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




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




У меня была такая же проблема, и я решил, изменив следующее в 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>



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




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

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

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




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

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

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

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

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

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

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

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

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

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




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




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

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

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

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




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




  1. Откройте «Обозреватель решений».
  2. Нажмите «Показать все файлы»
  3. Развернуть «Ссылки»
  4. Вы увидите одну (или более) ссылку (ы) с немного отличающимся значком, чем остальные. Как правило, это желтая коробка, предлагающая вам принять к сведению ее. Просто удалите его.
  5. Добавьте ссылку назад и скомпилируйте свой код.
  6. Это все.

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




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