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

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

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

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

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

Ответов (19)

Решение

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

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

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

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

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

  • Вы можете использовать такую ​​утилиту, как та, что находится на https://gist.github.com/1553265.
  • Еще один простой способ - установить подробность вывода сборки (Инструменты, Параметры, Проекты и решения, Сборка и запуск, Подробная информация о выводе сборки проекта MSBuild, Подробно) и после сборки поискать предупреждение в окне вывода и посмотреть на текст чуть выше него. . (Подсказка для Паулоя, который предложил это в комментариях к этому ответу) .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Очень просто

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

В 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 Это устранило проблему!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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