Avatar ·

Ошибка "The located assembly's manifest definition does not match the assembly reference" в C#

Всем привет! Я новичок в C# и столкнулся с ошибкой, которая вылетает при компиляции или запуске проекта: "The located assembly's manifest definition does not match the assembly reference" У меня есть решение с несколькими проектами. В одном проекте (MyApp) я использую библиотеку Newtonsoft.Json версии 12.0.3. В другом проекте (MyLibrary) я также использую Newtonsoft.Json, но версии 11.0.1. Всё собирается нормально, но при запуске вылетает эта ошибка. Вот пример кода: ```csharp // MyApp.csproj // MyLibrary.csproj ``` Сама ошибка выглядит так: ``` Could not load file or assembly 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. ``` Я пробовал переустанавливать пакеты через NuGet, чистить решение, но проблема остаётся. Как это исправить? Почему возникает такая ошибка, если оба проекта используют одну и ту же библиотеку, просто разные версии? <<>>

Что означает эта ошибка?

Эта ошибка возникает, когда в вашем приложении есть конфликт версий сборок (assemblies). .NET пытается загрузить сборку одной версии, но находит сборку с другой версией. В вашем случае: проект MyApp требует Newtonsoft.Json 12.0.3, но при запуске загружается версия 11.0.1 из MyLibrary, и их манифесты не совпадают.

Основные причины:

  • Разные версии одной библиотеки в проектах решения
  • Неправильные настройки bindingRedirect в конфигурационном файле
  • Кэширование старых версий сборок в bin/Debug папке
  • Прямые ссылки на файлы .dll вместо NuGet-пакетов

Самый надёжный способ решения — унификация версий через NuGet

Лучше всего привести все проекты к одной версии библиотеки. Сделайте так:

// В обоих проектах укажите одинаковую версию
// MyApp.csproj и MyLibrary.csproj
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />

После этого:

  1. Правой кнопкой на решение → "Управление пакетами NuGet для решения"
  2. Вкладка "Установленные" → найдите Newtonsoft.Json
  3. Выберите все проекты и нажмите "Обновить" до версии 12.0.3
  4. Пересоберите решение (Build → Rebuild Solution)

Если унификация невозможна — используйте bindingRedirect

Добавьте в app.config (или web.config) вашего запускаемого проекта перенаправление версий:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Это заставит .NET использовать версию 12.0.0.0 для всех запросов к Newtonsoft.Json, независимо от того, какую версию запрашивает библиотека.

Дополнительные шаги для очистки

  • Удалите папки bin и obj во всех проектах
  • Выполните в консоли диспетчера пакетов: Update-Package -Reinstall
  • Проверьте, нет ли в проекте прямых ссылок на .dll файлы (через "Add Reference" → "Browse")

Профилактика в будущем

Используйте Central Package Management в .NET 6+:

// Directory.Packages.props
<Project>
  <PropertyGroup>
    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
  </PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>
</Project>

Это гарантирует, что во всех проектах решения будет использоваться одна и та же версия пакета.

<<>>

Альтернативный подход: использование Fusion Log Viewer

Если вы не можете понять, какая именно сборка конфликтует, используйте встроенный инструмент .NET — Fusion Log Viewer (fuslogvw.exe). Он покажет подробный журнал загрузки сборок.

  1. Запустите Developer Command Prompt for VS от имени администратора
  2. Введите fuslogvw и нажмите Enter
  3. В настройках выберите "Log all binds to disk"
  4. Запустите ваше приложение с ошибкой
  5. В Fusion Log Viewer нажмите "Refresh" — вы увидите все попытки загрузки сборок

Ищите записи с "LOG: Attempting download of new URL" и "LOG: Assembly Name is: Newtonsoft.Json, Version=...". Там будет видно, какую версию запрашивает система и какую находит.

Ещё один простой способ — проверка через "Manage NuGet Packages"

В Visual Studio: ПКМ на решении → "Manage NuGet Packages for Solution" → вкладка "Consolidate". Там отображаются все пакеты, версии которых различаются между проектами. Просто нажмите "Consolidate" и выберите единую версию.

Если после всех манипуляций ошибка остаётся — проверьте, не используется ли в проекте сторонняя библиотека, которая внутри себя ссылается на старую версию Newtonsoft.Json. В таком случае поможет только обновление этой сторонней библиотеки до последней версии.