Виявлені конфлікти між різними версіями однієї і тієї ж залежної збірки, які неможливо було вирішити


371

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

Виявлені конфлікти між різними версіями однієї і тієї ж залежної збірки, які неможливо було вирішити. Ці конфліктні довідники перераховані в журналі збірки, коли докладно встановлено детальний опис журналу. C: \ програмні файли (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 і як мені потім зробити попередження?


2
Також дивіться ... stackoverflow.com/questions/1871073 / ...
SteveC

2
Я подав MS Connect пропозицію включити ім'я DLL у повідомлення connect.microsoft.com/VisualStudio/feedback/details/2619450
Michael Freidgeim

Відповіді:


513

ета: У цій статті є вбивча стаття власного SO @Nick Craver , яку слід прочитати


Хоча інші відповіді говорять про це, вони не роблять це явним, тому я буду ....

Для VS2013.2, щоб фактично викликати випромінювання цитованої інформації, вам не потрібно читати повідомлення, яке говорить:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): попередження MSB3277: Знайдено конфлікти між різними версіями тієї ж залежної збірки, які неможливо було вирішити. Ці конфліктні довідники перераховані в журналі збірки, коли докладно встановлено детальний опис журналу .

Це невірно (або, принаймні, це стосувалося деяких версій Visual Studio - здається, що це нормально для оновленої версії VS2015 3 або новішої версії). Замість цього переключіть його на діагностичнуІнструменти-> Опції-> Проект та рішення-> Створити та запустити , встановіть MSBuild проектного виводу багатослів’я ), після чого ви побачите такі повідомлення, як:

Був конфлікт між "Newtonsoft.Json, версія = 6.0.0.0, культура = нейтральна, PublicKeyToken = 30ad4fe6b2a6aeed" та "Newtonsoft.Json, версія = 6.0.5.17707, культура = нейтральна, PublicKeyToken = 30ad4fe6b2a6aeed".

  • "Newtonsoft.Json, версія = 6.0.0.0, культура = нейтральна, PublicKeyToken = 30ad4fe6b2a6aeed" вибрано, тому що вона була первинною, а "Newtonsoft.Json, версія = 6.0.5.17707, культура = нейтральна, 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:diagC:\Program Files (x86)\MSBuild\12.0\bin), щоб створити своє рішення з командного рядка та отримати трохи більше деталей, а потім знайдіть те, .csproj.що записує попередження, і перевірте його посилання та посилання інших проектів, які використовують ту саму спільну збірку, що відрізняється у версії.

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

Редагувати: Трохи роз'яснень, оскільки я щойно отримав одне. У моєму випадку попередження було через те, що я додав посилання за допомогою запиту Resharper на відміну від діалогового вікна Add Reference, який зробив це без версії, навіть незважаючи на те, що вибирати можна і 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.
БезумовноВстановітьMonica

39

Я можу підтримати подальшу відповідь Рубена лише порівнянням двох відображених повідомлень:

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

і повідомлення:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): попередження MSB3277: Знайдено конфлікти між різними версіями тієї ж залежної збірки, які неможливо було вирішити. Ці конфліктні довідники перераховані в журналі збірки, коли докладно встановлено детальний опис журналу .

Отже, справа Рубена - це просто неправда. Ніяких конфліктів немає, просто відсутні збори. Це особливо нудно, коли проект є додатком ASP.NET, оскільки перегляди складаються на вимогу , тобто безпосередньо перед тим, як відображатися вперше. Це коли виникає необхідність мати доступну збірку. (Існує можливість попередньо скласти представлення даних разом з рештою коду, але це вже інша історія .) З іншого боку, якщо ви встановили багатослівність на " Діагностика", ви отримаєте такий вихід:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): попередження MSB3245: Не вдалося вирішити цю посилання. Не вдалося знайти збірку "System.Web.Razor, версія = 3.0.0.0, культура = нейтральна, PublicKeyToken = 31bf3856ad364e35, ProcessArchitecture = 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, щоб побачити зміни в журналі складання.


16

і як мені потім зробити так, щоб попередження пройшло?

Вам, можливо, доведеться перевстановити або оновити ваші NuGet пакети, щоб виправити це.


2
Це, поєднавши перезапуск Visual Studio, коли вона відмовилася перевстановити пакет належним чином, вирішила проблему для мене.
Охад Шнайдер

22
Найпростіший спосіб перевірити: Клацніть правою кнопкою миші рішення -> Manage NuGet packages for solution-> Внизу Consolidateви можете побачити, чи встановлені різні версії одного пакета
elshev

16

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


1
це не вирішило для мене. Мені довелося видалити Newtonsoft.JSON та перевстановити через NuGet. Ця оновлена ​​залежність від інших пакетів.
Гарр Годфрі

Це трапилось і зі мною при використанні таких інструментів, як Resharper, які автоматично додають відсутні посилання DLL. "Завжди додавати за допомогою nuget" тут може бути гарною пропозицією.
Shaswat Rungta

Для мене це не працює, тому що для видалення пакета він намагається скласти, що не може статися, оскільки існує конфлікт пакетів. Тому я навіть не можу перейти до перевстановлення пакета :(
nickornotto

8

Я використовую Visual Studio 2017 і стикався з цим, коли я оновлював деякі пакунки Nuget. Що для мене працювало - це відкрити мій web.configфайл і знайти <runtime><assemblyBinding>вузол та видалити його. Зберегтиweb.config і відновіть проект.

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



3

Я міг би вирішити цю проблему, встановивши Newtonsoft Json у веб-проект за допомогою пакунків самородків


3

Очевидно, що існує багато різних причин, а отже, і багато рішень для цієї проблеми. Щоб кинути шахту в суміш, ми оновили збірку (System.Net.Http), на яку раніше безпосередньо посилався наш веб-проект, до версії, керованої NuGet. Це видалило пряме посилання в рамках цього проекту, але наш тестовий проект все ще містив пряму посилання. Оновлення обох проектів для використання збірки, керованої NuGet, вирішило проблему.



1

Я виявив, що іноді пакети нугетів встановлюватимуть (що я здогадуюсь) .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

Я дотримувався порад декількох відповідей тут, щоб з’ясувати, що було не так, але ні одна з відповідей не пояснювала, як це виправити. Моє питання полягало в тому, що для однієї посилання потрібна інша версія другої посилання. Так Newtonsoft був у версії 6, але деякі інші DLL хотіли 4.5. Тоді я модернізував Ньютонсофт, як запропонував одну з інших відповідей, і це погіршило ситуацію.

Тож я фактично знизив установку 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

Відповідно до інших відповідей, встановіть рівень реєстрації вихідних даних докладно та шукайте там конфлікти, що підкаже, де шукати далі.

У моєму випадку він відправив мене в декількох напрямках, шукаючи джерело посилань, але врешті-решт виявилося, що проблема була одним із моїх проектів бібліотеки портативного класу, вона націлена на неправильну версію і тягнула власну версія посилань у, отже, конфлікти. Швидке переорієнтація і проблема була вирішена.


0

Я просто зіткнувся з цим і проблемою після переключення пакета з nuget на локально вказані dlls. Проблема полягала в старих обов'язкових матеріалах для виконання app.config.


0

У мене виникло це попередження після переходу до Посилання на пакет. У діагностичному виведенні з'явилася інформація, що на бібліотеку посилалася та сама бібліотека. Це може бути помилка нового посилання на пакет. Рішення полягало в тому, щоб увімкнути AutoGenerateBindingRedirects та видалити спеціальні переадресації прив'язки.


0

VS 2017, проект MVC

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


-2

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

Це дозволить виправити MSB3277, що він робить для перевстановлення всіх пакетів та всіх пов'язаних збірок, з якими вони постачаються, до найвищої можливої ​​версії . Також можливо оновити лише конкретний пакет. Або понижуйте оновлення після оновлення, якщо потрібно, ця фіксована проблема для мене кілька разів виникала. Залежно від того, скільки пакунків з нулями у вас є, цей процес може зайняти кілька хвилин.

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


14
Ця порада може зіпсувати ваш день, якщо ви не хочете останніх пакунків, що часто трапляється для виробничого коду.
Тоні О'Хаган

1
Це вказується в порадах, і що може бути проблемою для вас, це безпечний і простий спосіб вирішити проблему, тому, будь ласка, не звертайтесь до людей, що переймаються вашою власною думкою.
Aistis Taraskevicius

1
Це рішення не спрацювало для мене. У мене вже були всі останні версії.
Zero3

@ Zero3: Ви запустили його від свого найвищого рішення, не вказуючи жодного пакета безпосередньо, він зазвичай працює, тому що він перевстановлює кожен окремий і оновлює посилання, що є причиною невідповідностей
Aistis Taraskevicius

3
Це справді жахлива порада. Це не думка, оновлення пакетів порушує код, якщо це не робиться з наміром.
Бетмен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.