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

StackOverflow https://stackoverflow.com/questions/17806

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

  • Вы можете использовать утилиту, подобную той, что можно найти по адресу https://gist.github.com/1553265
  • Другим простым методом является настройка Build детализация вывода (инструменты, параметры, проекты и решения, Сборка и Запустите, MSBuild project build (подробный вывод) и после сборки найдите в окне вывода предупреждение и посмотрите на текст прямо над ним. (Кончик шляпы к павлоя кто предложил это в комментариях к этому ответу).

Другие советы

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

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

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

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

Я хотел опубликовать решение 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.

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

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

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

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

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

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

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

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

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

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

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

  1. В обозревателе решений щелкните правой кнопкой мыши проект и выберите "Управление Пакетами Nuget"

  2. Выберите вкладку "Установленные пакеты" на левой панели и запишите установленные пакеты возможно, вы захотите скопировать packages.config на свой рабочий стол сначала, если у вас их много, чтобы вы могли перепроверить их с помощью Погуглите, чтобы узнать, какие pkgs Nuget установлены

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. перейдите на вкладку Общие в менеджере пакетов NuGet над Исходными текстами пакетов

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

  5. Очистите и восстановите, и предупреждение исчезнет

Проще простого

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top