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

Ни один из них не является более «правильным», чем другой, оба будут работать для вашего примера. Ничто не нарушает никаких правил.

Я сказал, что согласен с W3Schools на этом, поскольку эти данные должны проходить внутри дочерних элементов, а не из атрибутов. Особенно такие вещи, как IP-адреса, просто FEEL, как данные, которые должны быть дочерним элементом, а не атрибутом. Атрибуты, которые я обычно использую для метаданных, таких как автоматически сгенерированные идентификаторы.

Это особенно верно, если позже вы хотите учитывать расширение - например, что, если вы хотите связать несколько IP-адресов? С дочерними элементами вы можете просто добавить еще один элемент, но с атрибутами вы должны придумать новое имя атрибута для каждого добавления (ip1, ip2, ip3 ...).

418
задан AMissico 30 January 2010 в 21:24
поделиться

3 ответа

Измените «Verbousite Project MSBuild Project Project Build» на «подробное» или выше. Для этого выполните следующие действия:

  1. Восстанавливайте диалоговое окно «Параметры» ( Инструменты -> Варианты ... ).
  2. В левом дереве выберите проекты и решения узла, а затем выберите сборки и запустить .
    • Примечание. Если этот узел не отображается, убедитесь, что флажок в нижней части диалога показывает все настройки .
  3. На странице «Инструменты» / «Параметры», которая появляется, установите Verbity Project MSBuild Project Project Project Уровень Уровень Уровень Уровень Уровень в зависимости от соответствующей настройки в зависимости от вашей версии:

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

Проверьте сообщения MSBUILD. ResolveAssemblerference задача, которая является задачей, из которой происходит 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.
574
ответ дан 22 November 2019 в 23:22
поделиться

Иногда 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 и Структурированное Средство просмотра журнала и только генерируйте переадресации связывания для конфликтов в проекте, который испускает предупреждение (то есть, только мимо тех there was a conflict строки к входному текстовому файлу для кода выше [AssemblyConflicts.txt]).

1
ответ дан 22 November 2019 в 23:22
поделиться

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

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

21
ответ дан 22 November 2019 в 23:22
поделиться
Другие вопросы по тегам:

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