Ошибка "The located assembly's manifest definition does not match the assembly reference" в C#
Что означает эта ошибка?
Эта ошибка возникает, когда в вашем приложении есть конфликт версий сборок (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" />
После этого:
- Правой кнопкой на решение → "Управление пакетами NuGet для решения"
- Вкладка "Установленные" → найдите Newtonsoft.Json
- Выберите все проекты и нажмите "Обновить" до версии 12.0.3
- Пересоберите решение (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). Он покажет подробный журнал загрузки сборок.
- Запустите Developer Command Prompt for VS от имени администратора
- Введите
fuslogvwи нажмите Enter - В настройках выберите "Log all binds to disk"
- Запустите ваше приложение с ошибкой
- В 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. В таком случае поможет только обновление этой сторонней библиотеки до последней версии.