Разрешение MSB3247 - обнаружены конфликты между различными версиями одной и той же зависимой сборки

Решение .NET 3.5 закончилось этим предупреждением при компиляции с помощью msbuild.

Иногда NDepend может помочь, но в этом случае он не дал никаких подробностей. Как и Bob Мне пришлось прибегать к открытию каждой сборки в ILDASM, пока не нашел тот, который ссылался на более старую версию зависимой сборки.

Я попытался использовать MSBUILD из VS 2010 Beta 2 (поскольку в статье Connect указано, что это было исправлено в следующей версии CLR), но это также не предоставило более подробной информации (возможно, фиксированная пост-бета-версия 2)

Есть ли лучший (более автоматический) подход?

Ответ 1

Измените "многословность вывода проекта проекта MSBuild" на "Подробно" или выше. Для этого выполните следующие действия:

  • Поднимите диалог "Параметры" (Инструменты → Параметры...).
  • В левом дереве выберите Проекты и решения node, а затем выберите Сборка и запуск.
    • Примечание: если этот node не отображается, убедитесь, что установлен флажок в нижней части диалогового окна Показать все настройки.
  • На появившейся странице инструментов/опций установите для параметра MSBuild build output output verbosity соответствующий параметр в зависимости от вашей версии:

  • Создайте проект и посмотрите в окне вывода.

Проверьте сообщения MSBuild. Задача ResolveAssemblyReferences, являющаяся задачей, с которой начинается MSB3247, должна помочь вам отладить эту конкретную проблему.

Мой конкретный случай был неправильной ссылкой на SqlServerCe. Смотри ниже. У меня было два проекта, ссылающихся на две разные версии SqlServerCe. Я пошел в проект со старой версией, удалил ссылку, затем добавил правильную ссылку.

Target ResolveAssemblyReferences:
    Consider app.config remapping of assembly "System.Data.SqlServerCe, ..." 
        from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll] 
        to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
        to solve conflict and get rid of warning.
    C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 
        warning MSB3247: Found conflicts between different versions of the same dependent assembly.

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

  • Вы можете проверить свойства каждой ссылки.
  • Откройте свойства проекта и проверьте версии раздела "Ссылки".
  • Откройте проекты с помощью текстового редактора.
  • Используйте .Net Reflector.

Ответ 2

Майк Хэдлоу разместил небольшое консольное приложение под названием AsmSpy, которое довольно красиво перечисляет ссылки на каждую сборку:

Reference: System.Net.Http.Formatting
        4.0.0.0 by Shared.MessageStack
        4.0.0.0 by System.Web.Http

Reference: System.Net.Http
        2.0.0.0 by Shared.MessageStack
        2.0.0.0 by System.Net.Http.Formatting
        4.0.0.0 by System.Net.Http.WebRequest
        2.0.0.0 by System.Web.Http.Common
        2.0.0.0 by System.Web.Http
        2.0.0.0 by System.Web.Http.WebHost

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

Ответ 3

Когда-то ответить @AMissico недостаточно. В моем случае я не смог найти ошибку в окне вывода, поэтому решил создать файл журнала и проанализировать его, выполнив следующие шаги:

  • Сохранение журнала сборки в файл... https://msdn.microsoft.com/en-us/library/ms171470.aspx

    msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed

  • Найдите текст: warning MS... или конкретную информацию о предупреждении: (например, строка 9293) Found conflicts between different versions..., и полная информация об ошибке конфликта будет выше этого сообщения (например, строка 9277) There was a conflicts between... Find the error message

Visual Studio 2013

Ответ 4

Я обнаружил, что (по крайней мере, в Visual Studio 2010) вам нужно установить выводную детализацию, по крайней мере, в деталях, чтобы определить проблему.

Возможно, моя проблема была ссылкой, которая ранее была ссылкой GAC, но это было уже не так после моей установки.

Ответ 5

У меня была такая же ошибка и я не мог понять это с другими ответами. Я обнаружил, что мы можем "Консолидировать" пакеты NuGet.

  • Щелкните правой кнопкой мыши по решению
  • Нажмите "Управление пакетами Nuget"
  • Консолидация вкладки и обновление для той же версии.

Ответ 6

Это предупреждение создано для бета-версии ASP.NET MVC 4 по умолчанию см. здесь

В любом случае это предупреждение можно устранить, вручную отредактировав .csproj для вашего проекта.

modify........: Reference Include = "System.Net.Http"

читать......: Ссылка Include = "System.Net.Http, Version = 4.0.0.0"

Ответ 7

Используйте считыватель зависимостей

Используя dep.exe, вы можете просмотреть все вложенные зависимости всей папки. В сочетании с инструментами unix, такими как grep или awk, он может помочь вам решить вашу проблему.

Поиск ссылок, на которые ссылаются более чем на одну версию

$ dep | awk '{ print $1 " " $2; print $4 " " $5 }' | awk '{ if (length(versions[$1]) == 0) versions[$1] = $2; if (versions[$1] != $2) errors[$1] = $1; }  END{ for(e in errors) print e } ' 
System.Web.Http            

Эта непонятная командная строка запускает dep.exe, а затем дважды выводит результат на awk на

  • поместите родительский элемент и дочерний элемент в один столбец (по умолчанию каждая строка содержит одного родителя и ребенка, чтобы выразить тот факт, что этот родитель зависит от этого ребенка)
  • затем выполните некую "группу" с помощью ассоциативного массива

Понимание того, как эта сборка была извлечена в вашем бункере

$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1 

В этом примере инструмент покажет вам, что System.Web.Http 5.2.3 поступает из вашей зависимости в FooLib, тогда как версия 4.0.0 - из BarLib.

Тогда у вас есть выбор между

  • убедить владельцев libs использовать одну и ту же версию
  • остановить использование одного из них.
  • добавление переадресации связывания в вашем файле конфигурации для использования последней версии

Как запустить эти вещи в Windows

Если у вас нет оболочки типа unix, вам нужно загрузить ее, прежде чем сможете запустить awk и grep. Попробуйте выполнить одно из следующих действий:

Ответ 8

У меня тоже была эта проблема, и мы использовали совет AMissico, чтобы обнаружить проблему (хотя мне пришлось установить уровень детализации в подробный.

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

Фон: Я обновил свой проект с VS2008 до VS2010. В VS2008 целевая структура была 3.5, и когда я привел ее в VS2010, я переключил ее на 4 (Full). Я также обновил некоторые сторонние компоненты, включая отчеты Crystal.

Оказалось, что большинство ссылок на систему ссылаются на версию 4.0.0.0, но пара не была автоматически изменена (System и System.Web.Services) и все еще смотрела на 2.0.0.0. Отчеты Crystal ссылаются на 4.0.0.0, и поэтому это произошло там, где происходили конфликты. Просто помещая курсор в первую Системную библиотеку в проводнике решений, курсор вниз по списку и ищет ссылки на 2.0.0.0, удаление и повторное добавление новой версии 4.0.0.0 сделали трюк.

Странно, что большинство ссылок были правильно обновлены, и если бы не отчеты Crystal, я, вероятно, никогда бы не заметил...

Ответ 9

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

Ответ 10

Я сделал приложение на основе приложение Майка Хадлоу: AsmSpy.

Мое приложение - это приложение WPF с графическим интерфейсом и может быть загружено с моего домашнего веб-сервера: AsmSpyPlus.exe.

Код доступен по адресу: GitHub

Пример Gui

Ответ 11

Менеджер сборки ASP.NET создает веб-сайт, перейдя по папкам в алфавитном порядке, и для каждой папки он определяет его зависимости и сначала создает зависимости, а затем выбранную папку.

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

Затем следующая папка, которая построена (~/File-Center/Control), зависит от корневой папки ~/, которая зависит от ~/Элементы управления, поэтому папка ~/Элементы управления снова создаются только на этот раз элементами управления которые были разделены на их собственную сборку, теперь соединены с той же самой сборкой, что и другие элементы управления с разделенной сборкой, на которую все еще ссылаются.

Итак, на этом этапе 2 сборки (по крайней мере) имеют одинаковые элементы управления и сборка не выполняется.

Хотя мы до сих пор не знаем, почему это произошло, мы смогли обойти это, изменив имя папки Controls на ZControls, таким образом, он не был создан до ~/File-Center/Control, только после и таким образом он построен так, как должен.

Ответ 12

Быстрое исправление:

Щелкните правой кнопкой мыши по решению → Управление пакетами NuGet для решения → В разделе Консолидация вы увидите, были ли установлены разные версии одного и того же пакета. Удалите различные версии и установите последнюю версию.

Ответ 13

Иногда AutoGenerateBindingRedirects недостаточно (даже с GenerateBindingRedirectsOutputType). Поиск всех записей There was a conflict и их ручное исправление могут быть утомительными, поэтому я написал небольшой фрагмент кода, который анализирует выходные данные журнала и генерирует их для вас (создает дамп в stdout):

// Paste all "there was a conflict" lines from the msbuild diagnostics log to the file below
const string conflictFile = @"C:\AssemblyConflicts.txt";

var sb = new StringBuilder();
var conflictLines = await File.ReadAllLinesAsync(conflictFile);
foreach (var line in conflictLines.Where(l => !String.IsNullOrWhiteSpace(l)))
{
    Console.WriteLine("Processing line: {0}", line);

    var lineComponents = line.Split('"');
    if (lineComponents.Length < 2) 
        throw new FormatException("Unexpected conflict line component count");

    var assemblySegment = lineComponents[1];
    Console.WriteLine("Processing assembly segment: {0}", assemblySegment);
    var assemblyComponents = assemblySegment
                              .Split(",")
                              .Select(kv => kv.Trim())
                              .Select(kv => kv.Split("=")
                              .Last())
                              .ToArray();

    if (assemblyComponents.Length != 4) 
        throw new FormatException("Unexpected conflict segment component count");

    var assembly = assemblyComponents[0];
    var version = assemblyComponents[1];
    var culture = assemblyComponents[2];
    var publicKeyToken = assemblyComponents[3];

    Console.WriteLine("Generating assebmly redirect for Assembly={0}, Version={1}, Culture={2}, PublicKeyToken={3}", assembly, version, culture, publicKeyToken);
    sb.AppendLine($"<dependentAssembly><assemblyIdentity name=\"{assembly}\" publicKeyToken=\"{publicKeyToken}\" culture=\"{culture}\" /><bindingRedirect oldVersion=\"0.0.0.0-{version}\" newVersion=\"{version}\" /></dependentAssembly>");
}

Console.WriteLine("Generated assembly redirects:");
Console.WriteLine(sb);

Совет: используйте MSBuild Binary и Structured Log Viewer и генерируйте только перенаправления привязки для конфликтов в проекте, который выдает предупреждение (то есть, только после этих строк there was a conflict во входной текстовый файл для код выше [AssemblyConflicts.txt]).

Ответ 14

Самый простой способ без учета (внутренних) зависимостей:

  • Откройте "Обозреватель решений".
  • Нажмите "Показать все файлы"
  • Развернуть "Ссылки"
  • Вы увидите одну (или более) ссылку с немного отличающимся значком, чем остальные. Как правило, это желтая коробка, предлагающая вам принять к сведению ее. Просто удалите его.
  • Добавьте ссылку назад и скомпилируйте свой код.
  • Что все.

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

Ответ 15

Добавление Visual Studio для Mac сообщества:

Поскольку ответ AMissico требует изменения уровня журнала, и ни ASMSpy, ни ASMSpyPlus не доступны в качестве кроссплатформенного решения, вот краткое дополнение для Visual Studio для Mac:

https://docs.microsoft.com/en-us/visualstudio/mac/compiling-and-building

Это в сообществе Visual Studio → Настройки... → Проекты → Журнал сборки → Многословие

Ответ 16

Если у вас есть резкость, удалите все неиспользуемые ссылки в вашем решении.