Сведения о вопросе

Ayrat

18:12, 6th August, 2020

Теги

.net   warnings    

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

Просмотров: 540   Ответов: 17

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

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

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

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



  Сведения об ответе

appple

23:29, 11th August, 2020

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


  Сведения об ответе

dumai

22:49, 5th August, 2020

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

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

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

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


  Сведения об ответе

COOL

12:25, 23rd August, 2020

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

Самый простой способ узнать, что такое "offending reference(s)" - это задать детализацию вывода сборки (инструменты, опции, проекты и решения, Сборка и запуск проекта MSBuild построения, детализации, детализация) и после построения выполните поиск предупреждения в окне вывода. Видеть текст прямо над ним.

Например, когда вы ищете панель вывода для "conflict", вы можете найти что-то вроде этого:

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.


  Сведения об ответе

SEEYOU

01:32, 14th August, 2020

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

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


  Сведения об ответе

nYU

01:35, 21st August, 2020

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


  Сведения об ответе

VERSUION

20:58, 12th August, 2020

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


  Сведения об ответе

PAGE

21:01, 20th August, 2020

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


  Сведения об ответе

pumpa

10:44, 20th August, 2020

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

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

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


  Сведения об ответе

baggs

21:47, 27th August, 2020

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

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

  1. Из решения Explorer щелкните правой кнопкой мыши проект и выберите команду " управление Пакеты Nuget'

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

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

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

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

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

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

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


  Сведения об ответе

lourence

20:32, 14th August, 2020

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

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

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

это решило мой issue.hope он помогает и вам тоже. с уважением.


  Сведения об ответе

#hash

14:02, 14th August, 2020

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


  Сведения об ответе

9090

15:51, 19th August, 2020

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


  Сведения об ответе

KOMP

06:22, 29th August, 2020

  1. Открой "Solution Explorer".
  2. Нажмите на "Show all files"
  3. Развернуть "References"
  4. Вы увидите одну(или несколько) ссылку (ы) с немного отличающимся значком, чем rest. Как правило, это с желтой коробкой, предлагающей вам взять ее на заметку. Просто уберите его.
  5. Добавьте ссылку обратно и скомпилируйте свой код.
  6. Это все.

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


  Сведения об ответе

screen

05:04, 22nd August, 2020

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


  Сведения об ответе

piter

00:44, 18th August, 2020

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


  Сведения об ответе

KOMP

03:50, 3rd August, 2020

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


  Сведения об ответе

SSESION

12:11, 10th August, 2020

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

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

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

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

  4. проверьте "Skip Applying binding redirects" в Перенаправлениях привязки

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться