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

372

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

Обнаружены конфликты между разными версиями одной и той же зависимой сборки, которые не удалось разрешить. Эти конфликты ссылок перечислены в журнале сборки, когда подробность журнала установлена ​​на подробный. C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets

Когда я дважды щелкаю это сообщение, оно открывает файл C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets, но я ничего не понимаю в нем.

Я использую Visual Studio Express 2013 для Интернета.

Как я узнаю, что не так и с какой DLL и как я могу сделать так, чтобы предупреждение исчезло?

Кулер для воды v2
источник
2
Также смотрите ... stackoverflow.com/questions/1871073/…
SteveC
2
Я отправил в MS Connect предложение включить имя DLL в сообщение connect.microsoft.com/VisualStudio/feedback/details/2619450
Майкл Фрейдгейм,

Ответы:

513

eta: На эту статью написана потрясающая статья SO @Nick Craver, которую вы должны прочитать


В то время как другие ответы говорят это, они не делают это явным, поэтому я буду ....

На VS2013.2, чтобы фактически вызвать передачу цитируемой информации, вам не нужно читать сообщение, которое говорит:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): предупреждение MSB3277: обнаружены конфликты между различными версиями одной и той же зависимой сборки, которые не могут быть разрешены. Эти конфликты ссылок перечислены в журнале сборки, когда подробность журнала установлена ​​на подробный .

Это неверно (или, по крайней мере, так было в некоторых версиях Visual Studio - похоже, все в порядке в обновленном VS2015 Update 3 или более поздней версии). Вместо этого включите его в Diagnostic (из Tools-> Options-> Project and Solutions-> Build and Run , установите выходную детализацию сборки проекта MSBuild ), после чего вы увидите такие сообщения:

Возник конфликт между «Newtonsoft.Json, версия = 6.0.0.0, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed» и «Newtonsoft.Json, версия = 6.0.5.17707, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed».

  • «Newtonsoft.Json, версия = 6.0.0.0, Culture = нейтральный, PublicKeyToken = 30ad4fe6b2a6aeed» был выбран, поскольку он был основным, а «Newtonsoft.Json, версия = 6.0.5.17707, Culture = нейтральный, PublicKeyToken = 30ad4fe6b2a6aeed» не был.

затем

  • Ctrl-Alt-O перейти к окну Построить вывод
  • поиск " был выбран ", чтобы найти детализацию.

... И да, для тех, кто рассматривает детали [диагностического] сообщения, для этого невежды было новостью, что в городе существует соглашение, согласно которому все 6.xверсии являются внутренней версией сборки 6.0.0.0, т.е. только основной компонент SemVer входит в сборку. Версия :)

Рубен Бартелинк
источник
3
Спасибо - уже много лет пользуюсь Visual Studio и никогда не сталкивался с проблемой, требующей такого углубления в журнал сборки. Другая проблема, но понимание того, что информация, которую я искал, куда-то излучалось, решило мою проблему.
Тимоти Ли Рассел
4
Подробный уровень журнала, кажется, работает внутри VS (так что никакой диагностики не требуется). Впрочем, не в первый раз MSBuild ведет себя по-разному внутри VS ....
Йоханнес Рудольф
105
Чтобы изменить подробности журнала из меню Сервис-> Параметры, затем найдите Проект и решения-> Построить и запустить
Дженн
3
В моем случае у меня было три конфликта, и один из них был ответственным за два других. Я скопировал свой «подробный» журнал сборки в Блокнот, произвел поиск «конфликта», обновил пакет NuGet для опознанной мной ссылки, и проблема была решена.
Исаак Лиман
@robotnik Спасибо за предложение по редактированию [которое было отклонено другими]. Фактически я включил информацию в конец ответа, но, надеюсь, ответ в том виде, в каком он есть сейчас, ясен, как вы и предполагали.
Рубен Бартелинк
76

Запустите msbuild Foo.sln /t:Rebuild /v:diag(из C:\Program Files (x86)\MSBuild\12.0\bin), чтобы построить свое решение из командной строки и получить немного больше информации, затем найдите то, .csproj.что регистрирует предупреждение, и проверьте его ссылки и ссылки на другие проекты, которые используют ту же общую сборку, которая отличается в версии.

Изменить: Вы также можете установить подробность сборки непосредственно в VS2013. Перейдите в меню Tools>, Optionsзатем перейдите Projects and Solutionsи установите MSBuild verbosity в Diagnostic.

Изменить: Несколько разъяснений, как я только что получил один сам. В моем случае предупреждение было связано с тем, что я добавил ссылку, используя подсказку Resharper, в отличие от диалогового окна «Добавить ссылку», которое делало его без версии, даже несмотря на то, что и v4, и v12 доступны для выбора.

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework" />

против

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework, Version=12.0.0.0, ..." />

В журнале MSBuild с /v:diagмногословностью это выглядело следующим образом. с указанием деталей, которые противоречили двум ссылкам:

  There was a conflict between 
  "Microsoft.Build.Framework, Version=4.0.0.0, ..." and 
  "Microsoft.Build.Framework, Version=12.0.0.0, ...". (TaskId:16)

      "Microsoft.Build.Framework, Version=4.0.0.0, ..." was chosen because it was primary and 
      "Microsoft.Build.Framework, Version=12.0.0.0, ..." was not. (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=4.0.0.0, ..." 
      [C:\...\v4.5.1\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v4.5.1\Microsoft.Build.Framework.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v4.5.1\Microsoft.Build.Framework.dll". (TaskId:16)
              Microsoft.Build.Framework (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=12.0.0.0, ..." 
      [C:\...\v12.0\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v12.0\Microsoft.Build.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

          C:\...\v12.0\Microsoft.Build.Engine.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.Engine.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3277: 
Found conflicts between different versions of the same dependent assembly that could not be resolved.  
These reference conflicts are listed in the build log when log verbosity is set to detailed. 
[C:\Users\Ilya.Kozhevnikov\Dropbox\BuildTree\BuildTree\BuildTree.csproj]
Илья Кожевников
источник
10
В итоге я записал эту команду в файл журнала, чтобы мне было легче ее просматривать:msbuild "Foo.sln" /t:Rebuild /v:d > build.log
CrazyPyro
2
Лучший способ добраться до терминала для этого: stackoverflow.com/a/22702405/268066
CrazyPyro
@CrazyPyro msbuild имеет «встроенный» канал - /l:FileLogger,Microsoft.Build.Engine;logfile=build.logобратите внимание на объяснения переключателей для регистраторов здесь
drzaus
3
Где находится «журнал сборки»? Как мне это найти?
Заключенный НОЛЬ
Этот ответ показывает, как получить больше подробностей от msbuild, о чем заботится моно пользователь. Все остальные ответы предполагают, что вы используете VS и работаете в среде Windows.
Безоговорочно Восстановить
39

Я могу только поддержать дальнейший ответ Рубена сравнением двух отображаемых сообщений:

введите описание изображения здесь

и сообщение:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): предупреждение MSB3277: обнаружены конфликты между различными версиями одной и той же зависимой сборки, которые не могут быть разрешены. Эти конфликты ссылок перечислены в журнале сборки, когда подробность журнала установлена ​​на подробный .

Итак, Рубен прав - это просто неправда. Нет никаких конфликтов, просто отсутствует сборка. Это особенно скучно, когда проект является приложением ASP.NET, так как представления компилируются по требованию , то есть непосредственно перед первым отображением. Это когда становится необходимым иметь доступную сборку. (Существует возможность предварительно скомпилировать представления вместе с остальной частью кода, но это уже другая история .) С другой стороны, если вы установите для многословия значение Diagnostic, вы получите следующий вывод:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): предупреждение MSB3245: не удалось разрешить эту ссылку. Не удалось найти сборку "System.Web.Razor, версия = 3.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35, processorArchitecture = MSIL". Убедитесь, что сборка существует на диске. Если эта ссылка требуется вашим кодом, вы можете получить ошибки компиляции.

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

  1. Добавьте ссылку на сборку вручную (найдите ее на диске, может быть, GAC, и добавьте как «прямую» ссылку), или
  2. Используйте пакет NuGet (если он опубликован в галерее), чтобы загрузить его и сослаться на содержащуюся в нем сборку.

Подробнее о галерее NuGet здесь . Подробнее о предварительной компиляции представлений ASP.NET здесь .

Александр Христов
источник
В VS 2017, когда я установил для «Подробность вывода сборки проекта MSBuild» (не для файла журнала) значение «Подробно» (не для диагностики), я получил ошибку «Не удалось найти сборку» в окне «Вывод».
ALEXintlsos
@ALEXintlsos: очевидно, эта функциональность изменилась; Тем не менее, у вас есть ошибка, где бы она ни была - следуйте инструкциям, чтобы избавиться от нее.
Александр Христов
22

Изменение детализации сборки в визуальной студии поможет указать правильное направление. Выполните следующие шаги, чтобы изменить многословие в VS

  1. Зайдите в Сервис-> Параметры меню в VS
  2. Открытые проекты и решения-> Построить и запустить
  3. Измените значение многословности выходных данных сборки проекта MSBuild. Выберите один из Quiet, Minimal, Normal, DetailedиDiagnostic

Проверьте окно вывода ( Ctrl+ Alt+ O) в VS, чтобы увидеть изменения в журнале сборки.

Sree
источник
16

и как мне сделать так, чтобы предупреждение исчезло?

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

CrazyPyro
источник
2
Это, с комбинацией перезапуска Visual Studio, когда он отказался переустановить пакет должным образом, решило проблему для меня.
Охад Шнайдер
22
Самый простой способ проверить это: щелкнуть правой кнопкой мыши по решению -> Manage NuGet packages for solution-> Под ним Consolidateможно увидеть, были ли установлены разные версии одного и того же пакета
elshev
16

Повторение одного из комментариев от @elshev Щелкните правой кнопкой мыши по решению -> Управление пакетами NuGet для решения -> В разделе Консолидация вы можете увидеть, были ли установлены разные версии одного и того же пакета. Обновите пакеты там. Ошибка конфликта разрешена.

Шасват Рунгта
источник
1
это не решило для меня. Мне пришлось удалить Newtonsoft.JSON и переустановить через NuGet. Это обновленные зависимости от других пакетов.
Гарр Годфри
Это также случилось со мной при использовании таких инструментов, как Resharper, которые автоматически добавляют недостающие ссылки на DLL. "Всегда добавлять, используя nuget" может быть хорошим предложением здесь.
Шасват Рунгта
Это не работает для меня, потому что для удаления пакета он пытается выполнить сборку, которая не может произойти из-за конфликта пакетов. Поэтому я даже не могу переустановить пакет :(
nickornotto
8

Я использую Visual Studio 2017 и столкнулся с этим при обновлении некоторых пакетов Nuget. Что мне помогло, так это открыть мой web.configфайл, найти <runtime><assemblyBinding>узел и удалить его. Сохраните web.configи перестройте проект.

Посмотри в Error Listокно. Вы увидите, что выглядит как массивно длинное предупреждение о связывающих конфликтах. Дважды щелкните по нему, и он автоматически воссоздает <runtime><assemblyBinding>блок с правильными сопоставлениями.

RandomHandle
источник
6

Как указано в выпуске 6583 CLI dotnet, проблема должна быть решена с помощью dotnet nuget locals --clear allкоманды.

Хосе Л. Гарсия
источник
1
Это не сработало для меня; ситуация была такой же после запуска команды.
Зимано
3

Я мог бы решить эту установку Newtonsoft Json в веб-проекте с пакетами самородков

Каролина
источник
3

Очевидно, есть много разных причин и, следовательно, множество решений этой проблемы. Чтобы добавить мой микс, мы обновили сборку (System.Net.Http), на которую ранее непосредственно ссылались в нашем веб-проекте, до версии, управляемой NuGet. Это удалило прямую ссылку в этом проекте, но наш тестовый проект все еще содержал прямую ссылку. Обновление обоих проектов для использования сборки, управляемой NuGet, решило проблему.

joelmdev
источник
2

Если вы внесли какие-либо изменения в пакеты - снова откройте sln. Это сработало для меня!

Наумаан Шейх
источник
1

Я обнаружил, что иногда пакеты nuget будут устанавливаться (что я предполагаю) .NET Core требуются компоненты или другие элементы, которые конфликтуют с уже установленной платформой. Мое решение было открыть файл проекта (.csproj) и удалить эти ссылки. Например, System.IO, System.Threading и другие, как правило, добавляются, когда Microsoft.Bcl включен через какой-то недавно установленный пакет NuGet. Там нет причин для конкретных версий тех, в моих проектах, поэтому я удаляю ссылки и сборки проекта. Надеюсь, это поможет.

Вы можете найти в файле проекта «ссылку» и удалить конфликты. Если они включены в System, избавьтесь от них, и сборка должна работать. Это может не ответить на все случаи этой проблемы - я проверяю, знаете ли вы, что сработало для меня :)

Пример того, что я прокомментировал:

<!-- <Reference Include="System.Runtime, Version=2.6.9.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> -->
  <!-- <HintPath>$(SolutionDir)packages\Microsoft.Bcl.1.1.9\lib\net40\System.Runtime.dll</HintPath> -->
  <!-- <Private>True</Private> -->
<!-- </Reference> -->

Аури Рахимзаде
источник
1

Я только столкнулся с этим и проблемой после переключения пакета от nuget до локально ссылающихся dll. Проблема была в старых связывающих вещах app.config.

Том Макин
источник
1

Я последовал совету нескольких ответов здесь, чтобы выяснить, что не так, но ни один из ответов, казалось, не объяснял, как это исправить. Моя проблема заключалась в том, что одна ссылка требовала другой версии второй ссылки. Итак, Newtonsoft была на 6-й версии, но некоторые другие DLL хотели 4.5. Затем я обновил Newtonsoft, как и один из предложенных ответов, и это ухудшило ситуацию.

Так что я на самом деле понизил свою установку Newtonsoft, и предупреждение исчезло (VS 2017):

Щелкните правой кнопкой мыши Ссылки в обозревателе решений и выберите Управление пакетами NuGet ... На вкладке «Установлено» найдите Newtonsoft (или какой-либо другой конфликт). С правой стороны рядом с «Версией» появится раскрывающийся список, который можно изменить на более старую. версии. Для меня не было очевидно, что этот выпадающий список может быть использован для понижения.

Эндрю
источник
1

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

dotnet run --verbosity diagnostic >> full_build.log

После завершения сборки вы можете найти ошибку в файле журнала (full_build.log). Например, поиск «конфликта» должен привести вас к проблеме.

Принц Оуэн
источник
0

Я удалил Microsoft ASP.NET MVC nuget.org из управления NuGet Packagaes и снова переустановил его. При переустановке он разрешил все конфликты, связанные с версией бритвы. Попробуй это .

Джитендра Р
источник
0

Я изменил многословность MSBuild на Diagnostic.but не мог найти, где проблема, поэтому согласно ответам выше у меня был этот код в app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="XbimXplorer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

Поэтому я просто изменил первую Систему, Версия с 4.0.0.0 на 12.0.0.0, и мой проект сработал.

Пантелица Мавровоуниоти
источник
0

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

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

car1bo
источник
0

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

raV720
источник
0

VS 2017, проект MVC

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

jonathana
источник
-2

Запустить Update-Packageкоманду через консоль диспетчера пакетов

Это исправит MSB3277, для чего он переустановит все пакеты и все связанные с ними сборки до максимально возможной версии . Также возможно обновить только конкретный пакет. Или понизьте версию после обновления, если хотите, эта исправленная проблема для меня несколько раз поднималась. В зависимости от количества пакетов nuget этот процесс может занять несколько минут.

Больше информации на официальных документах https://docs.microsoft.com/en-us/nuget/consume-packages/reinstall-and-updating-packages

Аистис Тараскявичюс
источник
14
Этот совет может испортить ваш день, если вы не хотите использовать новейшие пакеты, как это часто бывает для производственного кода.
Тони О'Хаган
1
Это указано в рекомендации, и то, что может быть проблемой для вас, является безопасным и простым способом решения проблемы, поэтому, пожалуйста, не допускайте опровержения людей по вашему собственному мнению.
Аистис Тараскявичюс
1
Это решение не сработало для меня. У меня уже были все последние версии.
Zero3
@ Zero3 Если вы запускали его из своего топового решения, без указания какого-либо пакета напрямую, он обычно работает, потому что переустанавливает каждый из них и обновляет ссылки, что и вызывает несоответствия
Aistis Taraskevicius,
3
Это действительно ужасный совет. Это не мнение, обновление пакетов нарушает код, если не сделано с намерением.
TheBatman