Предупреждение:Обнаружены конфликты между разными версиями одной и той же зависимой сборки
Вопрос
В настоящее время я разрабатываю .NET-приложение, которое состоит из 20 проектов.Некоторые из этих проектов скомпилированы с использованием .NET 3.5, некоторые другие по-прежнему являются проектами .NET 2.0 (пока проблем нет).
Проблема в том, что если я включаю внешний компонент, я всегда получаю следующее предупреждение:
"Found conflicts between different versions of the same dependent assembly".
Что именно означает это предупреждение и, возможно, есть возможность исключить это предупреждение (например, используя #pragma disable в файлах исходного кода)?
Решение
Это предупреждение означает, что два проекта ссылаются на одну и ту же сборку (например System.Windows.Forms
) но для этих двух проектов требуются разные версии.У вас есть несколько вариантов:
Перекомпилируйте все проекты для использования одних и тех же версий (например,переместить все в .Net 3.5).Это предпочтительный вариант, поскольку весь код выполняется с версиями зависимостей, с которыми они были скомпилированы.
Добавить перенаправление привязки.Это приведет к подавлению предупреждения.Однако ваши проекты .Net 2.0 будут (во время выполнения) привязаны к версиям зависимых сборок .Net 3.5, таким как
System.Windows.Forms
.Вы можете быстро добавить перенаправление привязки, дважды щелкнув по ошибке в Visual Studio.Использование
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, будет указывать на что-то другое.
Если вы хотите обновить свои зависимости, выполните следующие действия:
В обозревателе решений щелкните правой кнопкой мыши проект и выберите "Управление Пакетами Nuget"
Выберите вкладку "Установленные пакеты" на левой панели и запишите установленные пакеты возможно, вы захотите скопировать packages.config на свой рабочий стол сначала, если у вас их много, чтобы вы могли перепроверить их с помощью Погуглите, чтобы узнать, какие pkgs Nuget установлены
Удалите свои пакеты.Все в порядке, мы собираемся добавить их обратно.
Немедленно установите нужные вам пакеты.Что сделает Nuget, так это не только предоставит вам последнюю версию, но и изменит ваши ссылки, а также добавит для вас обязательные перенаправления.
Делайте это для всех ваших проектов.
На уровне решения выполните Очистку и перестройку.
Возможно, вы захотите начать с проектов более низкого уровня и продвигаться к проектам более высокого уровня, а также перестраивать каждый проект по мере продвижения.
Если вы не хотите обновлять свои зависимости, вы можете воспользоваться консолью диспетчера пакетов и использовать синтаксис Update-Package -ProjectName [YourProjectName] [packageName] -Version [Номер версии]
=> проверьте, будет ли частично установлен какой-либо экземпляр приложения.
=> прежде всего удалите этот экземпляр из программы удаления.
=> затем очистите, перестройте и попробуйте развернуть.
это решило мою проблему.надеюсь, это поможет и вам.С наилучшими пожеланиями.
Также была эта проблема - в моем случае это было вызвано тем, что свойству "Конкретная версия" для ряда ссылок было присвоено значение true.Изменение этого значения на false для этих ссылок решило проблему.
Это случилось и со мной тоже.На одну библиотеку dll ссылались дважды:один раз прямо (в ссылках) и один раз косвенно (на который ссылается другой ссылочный проект).Я удалил прямую ссылку, очистил и перестроил решение.Проблема исправлена.
- Откройте "Обозреватель решений".
- Нажмите на кнопку "Показать все файлы".
- Разверните раздел "Ссылки".
- Вы увидите одну (или несколько) ссылок с несколько иным значком, чем у остальных.Как правило, это с желтым прямоугольником, предлагающим вам взять это на заметку.Просто уберите его.
- Добавьте ссылку обратно и скомпилируйте свой код.
- Вот и все.
В моем случае возникла проблема со ссылкой на 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 все, что мне нужно было сделать, это:
щелкните правой кнопкой мыши проект и выберите пункт Управление пакетами NuGet..
нажмите на шестеренку в правом верхнем углу
перейдите на вкладку Общие в менеджере пакетов NuGet над Исходными текстами пакетов
установите флажок "Пропустить применение перенаправлений привязки" в разделе Перенаправления привязки
Очистите и восстановите, и предупреждение исчезнет
Проще простого