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

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

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

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

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

+418
09 дек. '09 в 1:28
источник поделиться
15 ответов

Измените "многословность вывода проекта проекта 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.
+571
30 янв. '10 в 21:23
источник

Связанные вопросы


Похожие вопросы

Майк Хэдлоу разместил небольшое консольное приложение под названием 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.

+131
30 мар. '12 в 20:35
источник

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

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

+21
16 июн. '10 в 14:59
источник

Когда-то ответить @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

+20
10 сент. '15 в 21:07
источник

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

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

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

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

+7
25 апр. '12 в 9:02
источник

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

  • Щелкните правой кнопкой мыши по решению
  • Нажмите "Управление пакетами Nuget"
  • Консолидация вкладки и обновление для той же версии.
+6
19 февр. '17 в 22:08
источник

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

Используя 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. Попробуйте выполнить одно из следующих действий:

+6
06 янв. '16 в 15:49
источник

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

+4
02 нояб. '10 в 17:15
источник

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

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

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

Пример Gui

+2
18 авг. '15 в 18:44
источник

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

+2
02 июл. '12 в 7:57
источник

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

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

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

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

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

+1
29 апр. '11 в 21:05
источник

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

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

+1
04 авг. '17 в 13:02
источник

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

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

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

0
15 июн. '14 в 5:33
источник

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

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

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

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

0
15 мая '18 в 2:10
источник

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

0
09 июл. '19 в 15:16
источник

Посмотрите другие вопросы по меткам или Задайте вопрос