Определение манифеста обнаруженной сборки не соответствует ссылке на сборку

Я пытаюсь запустить несколько модульных тестов в приложении C# Windows Forms (Visual Studio 2005) и получаю следующую ошибку:

System.IO.FileLoadException: Could not load file or assembly 'Utility, Version=1.2.0.200, Culture=neutral, PublicKeyToken=764d581291d764f7' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)**

at x.Foo.FooGO()

at x.Foo.Foo2(String groupName_) in Foo.cs:line 123

at x.Foo.UnitTests.FooTests.TestFoo() in FooTests.cs:line 98**

System.IO.FileLoadException: Could not load file or assembly 'Utility, Version=1.2.0.203, Culture=neutral, PublicKeyToken=764d581291d764f7' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Я смотрю свои ссылки, и у меня есть только ссылка на Utility version 1.2.0.203 (другой старый).

Есть какие-нибудь предложения о том, как мне выяснить, на что ссылается эта старая версия этого DLL-файла?

Кроме того, я не думаю, что у меня на жестком диске даже есть эта старая сборка. Есть ли какой-нибудь инструмент для поиска этой старой версионной сборки?

В моем случае это произошло потому, что у меня было два проекта, загружающих одну и ту же DLL с разными версиями. (надеюсь, это кому-то поможет!)

miguelmpn 15.04.2020 20:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
795
1
1 071 229
57
Перейти к ответу Данный вопрос помечен как решенный

Ответы 57

Ответ принят как подходящий

Загрузчик сборки .NET:

  • не может найти 1.2.0.203
  • но нашел 1.2.0.200

Эта сборка не соответствует запрошенной, поэтому вы получаете эту ошибку.

Проще говоря, он не может найти сборку, на которую была сделана ссылка. Убедитесь, что он может найти нужную сборку, поместив ее в GAC или в путь к приложению. Также см. https://docs.microsoft.com/archive/blogs/junfeng/the-located-assemblys-manifest-definition-with-name-xxx-dll-does-not-match-the-assembly-reference.

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

leora 18.10.2008 17:40

Точно - это Ищу для 1.2.0.203, но это нашел 1.2.0.200. Узнайте, где находится этот файл, и замените его нужной версией.

Jon Skeet 18.10.2008 17:44

Я задал здесь аналогичный вопрос и получил рабочее решение: stackoverflow.com/questions/4187907/…

Michael La Voie 15.11.2010 23:12

Проверьте версию ссылок, а затем посмотрите, совпадает ли она в packages.config и Web.config

zdarsky.peter 31.10.2014 22:46

подробности о запуске fuslogw, как указано в приведенной выше ссылке на блог JunFeng blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx

hello_earth 06.11.2014 13:12

Могу ли я просто удалить содержимое GAC и восстановить эти файлы в моем проекте?

jp2code 26.05.2016 22:26

В моем случае в разделе «Сборка»> «Публикация» у меня был снят флажок «Удалить все существующие файлы перед публикацией», поэтому он использовал старую версию библиотеки DLL на сервере и не перезаписывал ее более новой версией, которая была у меня локально. Как только я проверил, что он отправил правильную версию в IIS и исправил ее.

James Toomey 24.06.2016 01:27

Web.config не соответствует packages.confg, спасибо @ zdarsky.peter

ohmusama 17.09.2016 01:57

У меня была эта ошибка с полностью отсутствующим пакетом nuget. Когда я перешел на nuget и установил пакет, ошибка была исправлена.

niico 30.04.2018 11:36

@Lars Truijens, как вы узнали, что он нашел 1.0.200? Я не вижу 200, упомянутого в трассировке стека OP?

Chillin' 14.09.2018 17:12

@ OnlineUser02094: Об этом буквально говорится в сообщении об исключении: Version = 1.2.0.200

Lars Truijens 14.09.2018 17:49

@lara Truijens ах да! Не видел этого

Chillin' 14.09.2018 18:57

Это сообщение меня каждый раз смущает. Вроде написано наоборот. Я ожидал, что он будет жаловаться на версию, которую вы просили загрузить, а не на найденную. Рад, что я не единственный, кто ошибается!

Greg Woods 02.11.2018 19:34

Я поискал в nuget проблемную сборку, установил ее (с новой версией), и проблема исчезла.

SimonKravis 28.11.2018 03:46

У меня была идентичная ошибка в проекте функции Azure, и с помощью fuslogvw.exe @ ra170 я определил, что assemblyIdentity Microsoft.Azure.Storage.Common "отсутствовал в func.exe.Config. Поэтому я добавил это: <dependentAssembly> <assemblyIdentity name = "Microsoft.Azure.Storage.Common" publicKeyToken = "31bf3856ad364e35" culture = "neutral" /> <bindingRedirect oldVersion = "0.0.0.0-9.0.0.0" newVersion = "9.0.0.0" /> </dependentAssembly>

Carlos Busca 21.02.2019 18:24

В моем случае каким-то образом файл Web.config просто отсутствовал, и я получаю указанную выше ошибку.

endo64 22.08.2019 09:47

Я думал, что Web.config там, но в учетной записи, которую я использовал на производственном сервере, была настройка, чтобы скрыть известные расширения файлов. Итак, в проводнике Windows я увидел Web.config, который на самом деле был Web.config.txt.

H. de Jonge 27.11.2019 19:29

Проблема появляется только при установке поверх существующей установки с помощью установщика VS2019 (при установленном флажке удаления более ранней версии). Кажется, ищет более раннюю установочную версию dll.

SimonKravis 18.10.2020 02:14

Проблема была вызвана ссылкой на DLL с v 106.8.10.0 в более ранней версии проекта и ссылкой на DLL v 105.2.3.0 из DLL2, появившейся в более поздней версии. Поскольку указанная версия из DLL2 (обнаруженная с помощью зависимостей) была раньше, чем уже существующая DLL из более ранней версии, она не была заменена новой версией, поэтому ссылка на DLL2 v 105.2.3.0 не удалась, поскольку ее там не было. Исправление заключалось в том, чтобы загрузить открытый исходный код для DLL2, ссылающейся на DLL 105.2.3.0, и перестроить его до последней версии 106.11.7.0. Это необходимо для обновления nuget.exe!

SimonKravis 21.10.2020 03:18

Вы можете сделать несколько вещей, чтобы устранить эту проблему. Во-первых, воспользуйтесь поиском файлов Windows, чтобы найти на жестком диске вашу сборку (.dll). Когда у вас есть список результатов, нажмите View-> Choose Details ... и затем отметьте «Версия файла». Это отобразит номер версии в списке результатов, чтобы вы могли видеть, откуда могла взяться старая версия.

Кроме того, как сказал Ларс, проверьте свой GAC, чтобы узнать, какая версия там указана. Эта статья Microsoft указывает, что сборки, найденные в GAC, не копируются локально во время сборки, поэтому вам может потребоваться удалить старую версию, прежде чем выполнять полную перестройку. (См. Мой ответ этот вопрос для заметок о создании командного файла, который сделает это за вас)

Если вы все еще не можете определить, откуда взялась старая версия, вы можете использовать приложение fuslogvw.exe, которое поставляется с Visual Studio, чтобы получить дополнительную информацию о сбоях привязки. У Microsoft есть информация об этом инструменте здесь. Обратите внимание, что вам нужно будет включить ведение журнала, установив для ключа реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog значение 1.

Не забывайте, что версия файла не является частью идентичности сборки. Версия сборки есть, но не обязательно должна совпадать с версией файла!

Lars Truijens 06.12.2011 12:10

Если вы используете fuslogvw для сервисов, прочтите blogs.msdn.com/b/junfeng/archive/2004/02/14/72912.aspx

Nick 28.09.2015 18:23

Поиск имени файла решил мою проблему. У меня была старая версия dll в моей папке Temporary ASP.Net, и InstallShield использовал ее вместо последней версии! Чистое решение, восстановление, перезагрузка ПК ничего не сделали. Работала нормально локально и взрывалась каждый раз при развертывании.

JumpingJezza 02.12.2015 06:24

Сразу после сборки мой сайт работает нормально, но через некоторое время возникает эта проблема.

Shavais 14.04.2017 18:27

Я отредактировал этот ответ, чтобы вместо этого указать версию сборки.

Worthy7 18.04.2019 12:22

<add assembly version = "X.X.X.X" ... в файле web.config, установленном на версию файла DLL, в моем случае полностью решила ошибку в теме.

access_granted 18.04.2020 08:37

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

Мы просто переходим на другой сервер, у нас возникла эта проблема, потому что мы сохраняем резервные копии. Сработало после удаления резервных копий. Спасибо :)

Jtuck 29.12.2018 21:09

Я сам столкнулся с этой проблемой и обнаружил, что проблема отличается от того, с чем столкнулись другие.

У меня было две библиотеки DLL, на которые ссылался мой основной проект: CompanyClasses.dll и CompanyControls.dll. Я получал сообщение об ошибке во время выполнения:

Could not load file or assembly 'CompanyClasses, Version=1.4.1.0, Culture=neutral, PublicKeyToken=045746ba8544160c' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference

Проблема была в том, что в моей системе не было файлов CompanyClasses.dll с номером версии 1.4.1. Ни в GAC, ни в папках приложений ... ни где. Я обыскал весь свой жесткий диск. Все файлы CompanyClasses.dll, которые у меня были, относятся к версии 1.4.2.

Я обнаружил, что настоящая проблема заключалась в том, что CompanyControls.dll ссылалась на версию 1.4.1 CompanyClasses.dll. Я только что перекомпилировал CompanyControls.dll (после ссылки на CompanyClasses.dll 1.4.2), и эта ошибка исчезла для меня.

+1 Нечто подобное произошло со мной, когда одна из моих DLL ссылается на старую версию Caliburn Micro.

Jason Massey 02.02.2013 03:48

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

Esen 06.02.2013 20:56

Другой вариант - открыть проект CompanyControls, щелкнув правой кнопкой мыши ссылку CompanyClasses.dll -> свойства -> SpecificVersion = false.

BlueRaja - Danny Pflughoeft 05.10.2013 02:43

это очень часто случается с приложениями xamarin. У меня был проект xamarin.forms, отличный от проекта xamarin.droid. Я только что увидел твой пост и узнал его.

Emil 06.03.2016 22:12

Если CompanyClasses.dll подписан, то SpecificVersion = false сам по себе не справится. Вам понадобится bindingredirect.

Denise Skidmore 11.05.2018 18:57

Для нас проблема была вызвана чем-то другим. Файл лицензии для компонентов DevExpress включал две строки, одну для старой версии компонентов, которая не была установлена ​​на этом конкретном компьютере. Удаление старой версии из файла лицензии решило проблему.

Раздражает то, что в сообщении об ошибке не указывается, какая ссылка вызвала проблемы.

В моем случае после обновления до новой версии DevExpress файл .resx формы содержал ссылки на старую неустановленную версию библиотеки. Мне пришлось открыть .resx в представлении кода и либо исправить версию на новую, либо удалить недопустимые записи.

Artemix 21.10.2011 01:58

Попробуйте добавить то, чего не хватает, в глобальный кеш сборок.

На самом деле я не получил голосов против. Когда ссылка отсутствует, иногда добавление ее в GAC на самом деле является ответом, ПРЕДПОЛАГАЯ, что ссылка указывается именно на него. Я согласен, что этот ответ можно было бы сформулировать как прямой ответ на вопрос автора, ссылку о том, как получить его в GAC, но давайте не будем наказывать за общий ответ - особенно с другим ветвлением, уже представленным здесь. Я рассматриваю SO как набор возможных ответов на тип ошибки, а не только на конкретный сценарий. И у них нет более 50 представителей, поэтому они не могут добавлять комментарии к вопросу или сообщениям (которые, ИМХО, должны измениться).

vapcguy 07.08.2014 06:42

Если вы используете Visual Studio, попробуйте «чистое решение», а затем перестройте свой проект.

Обычно это решение для меня. Часто удаление bin и obj делает это. По сути, кое-что, на что я ссылался, все еще сидит, пытаясь удовлетворить то же требование. Например, старая версия - это то, на что я ссылался напрямую, а новая версия находится в NuGet.

David Betz 15.10.2016 18:34

Обнаружена эта проблема для нескольких библиотек DLL после извлечения из TFS. Это решение исправило это для меня.

Milo 14.03.2018 21:24

Работал у меня. Удалена папка bin amd obj и проблема решена.

user1619480 20.07.2018 12:29

Спасибо, у меня тоже сработало, просто удалив папку bin.

The Cookies Dog 12.11.2018 19:58

Для меня было достаточно удалить папку bin. Удивительно, но раньше я безуспешно пробовал чистое решение и восстановить решение. Иногда немного странно.

Lion 10.08.2019 20:43

«Чистый раствор» ничего не сделал для меня. (Microsoft ????) Но удаление папок bin и obj исправило это. Спасибо!

Mmm 10.12.2019 19:51

Эта точно такая же ошибка возникает, если вы пытаетесь выполнить позднюю привязку с помощью отражения, если сборка, к которой вы привязываете, получает строгое имя или ее токен открытого ключа изменен. Ошибка остается той же, даже если на самом деле не найдена сборка с указанным токеном открытого ключа.

Вам необходимо добавить правильный токен открытого ключа (вы можете получить его с помощью sn -T в dll), чтобы устранить ошибку. Надеюсь это поможет.

Уточните, пожалуйста, что такое sn -T? А где мне добавить токен открытого ключа?

Moritz Both 29.09.2010 12:03

sn.exe - это инструмент, который поставляется с Visual Studio, это инструмент командной строки, который можно запустить из командной строки Visual Studio. Просто запустите командную строку Visual Studio (из меню «Пуск»), перейдите в папку, содержащую вашу сборку, и введите «sn -T <assembly>», где <assembly> - полное имя библиотеки DLL. Это получает информацию о сборке "Token". После этого, когда вы выполняете позднюю привязку с отражением, введите информацию токена в строку идентификатора сборки (т. Е. «Assembly = MyAssembly.dll, токен открытого ключа = <token guid>).

Guy Starbuck 29.09.2010 18:57

Спасибо за этот ответ. Я получал эту ошибку при обращении к разделу конфигурации в моем App.ini. Я недавно подписал сборку, поэтому PublicKeyToken = null пришлось обновить новым (правильным) токеном.

Liam 19.10.2010 10:53

Моя ситуация была очень похожа на сообщение Натана Бедфорда, но с небольшим поворотом. Мой проект тоже ссылался на измененную dll двумя способами. 1) Непосредственно и 2) Косвенно путем ссылки на компонент (библиотеку классов), который сам имел ссылку на измененную dll. Теперь мой проект Visual Studio для компонента (2) ссылается на правильную версию измененной dll. Однако номер версии самого компонента НЕ был изменен. В результате установка новой версии проекта не смогла заменить этот компонент на клиентской машине.

Конечный результат: прямая ссылка (1) и косвенная ссылка (2) указывали на разные версии измененной библиотеки DLL на клиентском компьютере. На моей машине dev все работало нормально.

Решение: удалить приложение; Удалите все библиотеки DLL из папки приложения; Переустановите. В моем случае все просто.

Щелкните правой кнопкой мыши ссылку в VS, установите для свойства "Определенная версия" значение True.

В моем случае это была старая версия DLL в каталоге C: \ WINDOWS \ Microsoft.NET \ Framework \ ~ \ Temporary ASP.NET Files \. Вы можете удалить или заменить старую версию или удалить и снова добавить ссылку на DLL в своем проекте. По сути, в любом случае будет создан новый указатель на временные файлы ASP.NET.

У меня это сработало, когда я закрыл Visual Studio, остановил IIS и удалил все временные файлы ASP.NET. Обратите внимание, что файлы могут находиться в папках Framework и Framework64 на 64-битной машине, а также в папках .NET 2.0 и 4.0!

Bryan B 12.08.2011 20:19

Я использовал функцию поиска в меню «Пуск» Windows, чтобы найти все библиотеки DLL, созданные моим решением, а затем удалил всю партию, где бы они ни были найдены. Я мог сделать это без страха, потому что они должны создаваться только во время отладки Visual Studio. Поскольку VS будет восстанавливать такие отсутствующие библиотеки DLL, и ничто, кроме моего решения, не должно ссылаться на них, для меня это была «безопасная» операция.

Zarepheth 18.06.2014 23:32

Я получил это сообщение об ошибке из-за ссылки на сборку, имя которой совпадает с именем сборки, которую я создавал.

Он был скомпилирован, но он заменил указанную сборку сборкой текущего проекта, что привело к ошибке.

Чтобы исправить это, я изменил имя проекта и свойства сборки, доступные при щелчке правой кнопкой мыши по проекту и выборе «Свойства».

Я позволю кому-нибудь извлечь выгоду из моей тупости, связанной с обрезанием. У меня есть некоторые зависимости от совершенно отдельного приложения (назовем это App1). DLL из этого App1 втягиваются в мое новое приложение (App2). Каждый раз, когда я делаю обновления в APP1, мне приходится создавать новые dll и копировать их в App2. Что ж. . . Мне надоело копировать и вставлять между двумя разными версиями App1, поэтому я просто добавил префикс NEW_ к dll.

Что ж. . . Я предполагаю, что процесс сборки сканирует папку / bin и, когда она что-то неправильно соответствует, выдает то же сообщение об ошибке, как указано выше. Я удалил свои "новые_" версии, и все получилось просто шикарно.

Моя проблема заключалась в копировании исходного кода на новую машину без перетягивания какой-либо из упомянутых сборок.

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

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

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

У меня была аналогичная проблема при попытке обновить один DLL-файл моего веб-сайта.

Эта ошибка возникла, когда я просто скопировал этот файл DLL в папку bin через FTP.

Я решил эту проблему:

  1. остановка сайта;
  2. копирование необходимых DLL файлов / DLL файлов;
  3. запуск сайта

Мой app.config содержит

<bindingRedirect oldVersion = "1.0.0.0" newVersion = "2.0.11.0"/>

для npgsql. Каким-то образом на машине пользователя пропал мой app.exe.config. Я еще не уверен, был ли это глупый пользователь, сбой установщика или отключенный антивирус. Замена файла решила проблему.

Следующее перенаправляет любую версию сборки на версию 3.1.0.0. У нас есть сценарий, который всегда будет обновлять эту ссылку в App.config, поэтому нам больше не придется сталкиваться с этой проблемой.

Через отражение вы можете получить сборку publicKeyToken и сгенерировать этот блок из самого файла .dll.

<assemblyBinding xmlns = "urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
    <assemblyIdentity name = "Castle.Core" publicKeyToken = "407dd0808d44fbdc" culture = "neutral" />
    <bindingRedirect oldVersion = "0.0.0.0-65535.65535.65535.65535" newVersion = "3.1.0.0" />
  </dependentAssembly>
</assemblyBinding>

Обратите внимание, что без атрибута пространства имен XML (xmlns) это не сработает.

Это сработало для меня. Я изменил newVersion = 3.3.3 на newVersion = 3.1.0.

jward01 02.02.2016 00:13

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

BanksySan 08.12.2016 17:57

Моя проблема заключалась в том, что перенаправления указывали на несуществующие сборки. App.Config содержал информацию о сборках из последних установленных мной пакетов NuGet. Когда я позже понизил эти пакеты, это НЕ убирало. Это была стандартная библиотека классов .NET, попавшая в проект модульного тестирования инфраструктуры 4.7.2. Проблема проекта модульного тестирования, представленная во время выполнения ..

D-Sect 26.10.2018 19:44

@ D-Sect права. Если ваш исходный элемент управления указывает, что в web.config есть изменения (потому что вы играли со своими NuGets), вам может быть разумно отказаться от этих bindingRedirects. При переходе на более раннюю версию NuGets не удаляются перенаправления привязки.

bkwdesign 01.11.2018 23:24

Для меня конфигурация покрытия кода в файле «Local.testtesttings» «вызвала» проблему. Я забыл обновить файлы, на которые там ссылались.

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

Ошибка четко указывает на то, что проблема заключается в следующем: когда мы пытаемся загрузить сборку, загрузчик сборки .NET пытается загрузить упомянутые сборки на основе данных своего манифеста (указанное имя сборки, токен открытого ключа, версия).

Чтобы проверить данные манифеста:

  1. Откройте командную строку Visual Studio,
  2. Введите «ildasm» и перетащите требуемую сборку в окно ILDASM и откройте представление МАНИФЕСТА. Иногда МАНИФЕСТ содержит одну сборку с двумя версиями: старая версия, а также новая версия (например, Utility, Version=1.2.0.200 и Utility, Version=1.2.0.203). На самом деле упомянутой сборкой является Utility, Version=1.2.0.203(new version), но поскольку манифест содержит даже Utility, Version=1.2.0.200(old version), загрузчик сборки .NET пытается найти этот DLL-файл с поддержкой версий, но не может найти и выдает исключение.

Чтобы решить эту проблему, просто перетащите каждую из зависимых сборок проекта в окно ILDASM отдельно и проверьте, какая зависимая сборка содержит данные манифеста со старой версией сборки. Просто перестройте эту зависимую сборку и верните ее в свой проект.

К сожалению, я не могу перетащить сборку в ildasm, так как ошибка мешает сборке сборки ...

Number8 11.04.2013 15:07

Звучит многообещающе, но я не понимаю, как это исправить. Я обнаружил в своем решении проект, имеющий две версии System.Web.Mvc. Когда я его перестраиваю, он все еще содержит две версии. Как мне избавиться от ссылки на старую версию?

mike nelson 14.07.2013 09:18

Другие ответы не сработают для меня. Если вам не важна версия, и вы просто хотите, чтобы ваше приложение запускалось, щелкните правой кнопкой мыши ссылку и установите для параметра «конкретная версия» значение false ... Это сработало для меня.

Этот параметр действует только в время компиляции. После компиляции ему потребуется та же самая версия сборки, с которой вы ее скомпилировали. См. stackoverflow.com/questions/24022134/…

Lars Truijens 12.05.2017 15:12

Я хотел бы просто добавить, что я создавал базовый проект ASP.NET MVC 4 и добавил DotNetOpenAuth.AspNet через NuGet. Это привело к той же ошибке после того, как я сослался на несоответствующий файл DLL для Microsoft.Web.WebPages.OAuth.

Чтобы исправить это, я сделал Update-Package и очистил решение для полной перестройки.

Это сработало для меня, и это отчасти ленивый способ, но время - деньги :-P

Аналогичный ответ для меня. Update-Package -reinstall переустанавливает все пакеты NuGet той же версии.

Jess 13.03.2017 16:08

Отлично; спасибо за публикацию. Я попробовал все эти другие замечательные предложения, но это было то, что помогло. Слава богу, люди, которые все еще готовы опубликовать альтернативное решение, даже когда их 80 доступны.

Hambone 13.07.2018 18:11

В файле AssemblyVersion в файле AssemblyInfo.cs используйте фиксированный номер версии вместо указания *. Значок * изменит номер версии для каждой компиляции. В моем случае это было проблемой для этого исключения.

Я столкнулся с этой проблемой при использовании внутреннего репозитория пакетов. Я добавил во внутренний репозиторий основной пакет, но не зависимости пакета. Убедитесь, что вы добавили все зависимости, зависимости зависимостей, рекурсивные и т. д. Во внутренний репозиторий.

Я добавил пакет NuGet только для того, чтобы понять, что часть моего приложения в виде черного ящика ссылается на более старую версию библиотеки.

Я удалил пакет и сослался на статический файл DLL старой версии, но файл web.config никогда не обновлялся из:

<dependentAssembly>
    <assemblyIdentity name = "Newtonsoft.Json" publicKeyToken = "30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion = "0.0.0.0-4.5.0.0" newVersion = "6.0.0.0" />
</dependentAssembly>

к тому, к чему он должен был вернуться, когда я удалил пакет:

<dependentAssembly>
    <assemblyIdentity name = "Newtonsoft.Json" publicKeyToken = "30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion = "0.0.0.0-4.0.0.0" newVersion = "4.5.0.0" />
</dependentAssembly>

Я видел это, когда, по крайней мере, для модуля Entity Framework при использовании NuGet, если вы щелкните правой кнопкой мыши свое решение, перейдите в раздел «Управление пакетами NuGet для решения», затем «Установленные пакеты»> «Все», выберите этот модуль, выберите «Управление», вы можете обычно снимают выделение с него в своем проекте. Это должно убрать подобные вещи без необходимости делать это вручную - при условии, что поставщик проявил должную осмотрительность. Но хороший улов, так как, по-видимому, иногда они этого не делают, если вы так его удалили.

vapcguy 07.08.2014 06:08

Может помочь ручное удаление старой сборки из папки и последующее добавление ссылки на новые сборки.

Сегодня у меня была такая же проблема, из-за которой я не смог выполнить Add-Migration после внесения изменений в Entity Framework.

В моем решении было два проекта, назовем их «Клиент» и «Данные» - проект библиотеки классов, который содержал мои модели EF и контекст. Клиент сослался на проект данных.

Я подписал оба проекта, а затем внес изменения в модель EF. После того, как я удалил подпись, я смог добавить миграции, а затем подписал проект заново.

Надеюсь, это может быть кому-то полезно и избавит от длительного разочарования.

У меня возникла эта проблема после начала использования InstallShield. Несмотря на то, что порядок сборки показал, что проект установки был последним, он строился из строя.

Я исправил это, сделав любой другой проект зависимым от него - это заставило установку собираться последней и тем самым устранило несоответствие моей сборки. Надеюсь, это поможет.

В моем случае проблема была между креслом и клавиатурой :-)

Could not load file or assembly 'DotNetOpenAuth.Core, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=2780ccd10d57b246' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)

Две или более разных сборок хотели использовать другую версию библиотеки DotNetOpenAuth, и это не было бы проблемой. Кроме того, на моем локальном компьютере файл web.config был автоматически обновлен NuGet:

<dependentAssembly>
    <assemblyIdentity name = "DotNetOpenAuth.AspNet" publicKeyToken = "2780ccd10d57b246" culture = "neutral" />
        <bindingRedirect oldVersion = "0.0.0.0-4.3.0.0" newVersion = "4.3.0.0" />
    </dependentAssembly>
    <dependentAssembly>
        <assemblyIdentity name = "DotNetOpenAuth.Core" publicKeyToken = "2780ccd10d57b246" culture = "neutral" />
    <bindingRedirect oldVersion = "0.0.0.0-4.3.0.0" newVersion = "4.3.0.0" />
</dependentAssembly>

Затем я понял, что забыл скопировать / развернуть новый файл web.config на производственном сервере. Поэтому, если у вас есть ручной способ развертывания web.config, проверьте, что он обновлен. Если у вас есть совершенно другой файл web.config для рабочего сервера, вам необходимо синхронизировать этот раздел зависимой сборки после использования NuGet.

У меня такая же ошибка ... В моем случае это разрешилось следующим образом:

  • Сначала, когда приложение было установлено, люди здесь использовали Microsoft Enterprise Library 4.1 в приложении.
  • На прошлой неделе моя машина была отформатирована, и после этого сегодня, когда я построил это приложение, он выдал мне ошибку, что сборка Enterprise Library отсутствует.
  • Затем я установил Microsoft Enterprise Library 5.0, которую я получил в Google в качестве первой поисковой записи.
  • Затем, когда я построил приложение, он дал мне указанную выше ошибку, т.е. определение манифеста обнаруженной сборки не соответствует ссылке на сборку.
  • После большой поисковой работы и анализа я обнаружил, что приложение ссылается на 4.1.0.0, а DLL в папке bin имеет версию 5.0.0.0.
  • Я тогда установил Microsoft Enterprise Library 4.1.
  • Удалена предыдущая ссылка (5.0) и добавлена ​​ссылка 4.0.
  • Создал приложение и вуаля ... оно сработало.

Я получил эту ошибку при создании службы сборки Team Foundation Server. Оказалось, что в моем решении было несколько проектов, использующих разные версии одной и той же библиотеки, добавленной с помощью NuGet. Я удалил все старые версии с помощью NuGet и добавил новую как ссылку для всех.

Team Foundation Server помещает все файлы DLL в один каталог, и, конечно же, одновременно может быть только один файл DLL с определенным именем.

Другой способ - нажать «Управление пакетами NuGet для решения ...» и обновить тестовый проект и тестируемый проект до одной и той же (самой новой) версии.

lixonn 20.10.2015 01:46

Это также может произойти, если вы используете как AssemblyInfo.cs с тегами AssemblyVersion, так и ваш файл .csproj с другим значением. Если сопоставить AssemblyInfo или удалить весь раздел, проблема исчезнет.

В моем случае эта ошибка произошла при запуске приложения ASP.NET. Решение было:

  1. Удалите папки obj и bin в папке проекта.

Очистка не сработала, перестройка не сработала, все ссылки были в порядке, но не было написано ни одной из библиотек. После удаления этих каталогов все работало отлично.

Спасибо, Леви Фуллер. Этот ответ должен быть выше; для моей ситуации это было правильно! Для меня эта ошибка началась, когда я сделал резервную копию своего web.config, и Visual Studio продолжала загружать этот файл конфигурации вместо фактической конфигурации даже после того, как я удалил дублирующую копию. Это решило это. Спасибо.

BruceHill 24.09.2017 08:08

У меня тоже работает. Все еще не уверен, почему это работает :(

KangarooWest 13.10.2017 01:21

Вот мой метод решения этой проблемы.

  1. Из сообщения об исключении получите имя «проблемной» библиотеки и номер «ожидаемой» версии.

  1. Найдите все копии этой DLL в своем решении, щелкните их правой кнопкой мыши и проверьте, какая это версия DLL.

Хорошо, в этом примере моя .dll определенно 2.0.5022.0 (поэтому номер версии Exception неверен).

  1. Найдите номер версии, который был показан в сообщении об исключении во всех файлах .csproj в вашем решении. Замените этот номер версии фактическим номером из библиотеки DLL.

Итак, в этом примере я бы заменил это ...

<Reference Include = "DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

... с этим...

<Reference Include = "DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

Дело сделано !

что, если в моих файлах csproj нет ссылки на версию?

John Demetriou 25.04.2017 14:07

Хорошо, еще один ответ. Я ранее создавал свое приложение как 64-битное и соответственно изменил путь вывода (Project / Properties / Build / Output / Output Path). Недавно я изменил приложение на 32-битное (x86), создав новый путь вывода. Я создал ярлык для мысль скомпилированного .exe. Независимо от того, что я изменил в источнике, он получил ошибку несоответствия манифеста. Примерно через час разочарования я случайно проверил дату / время файла .exe и увидел, что он старый, очевидно, ссылаясь на старые .dll. Я компилировал приложение в старый каталог, и мой ярлык ссылался на более новый. Изменил выходной путь туда, где находится .exe должен, запустил ярлык, и ошибка исчезла. (хлопает по лбу)

На вопрос уже есть ответ, но если проблема возникла в пакете NuGet в разных версиях одного решения, вы можете попробовать следующее.

Откройте диспетчер пакетов NuGet, как вы видите, моя версия проекта службы отличается от других.

Затем обновите проекты, содержащие старую версию вашего пакета.

Enter image description here

Простое удаление содержимого папки bin вашего проекта и восстановление решения решило мою проблему.

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

Ronny Mahlangu 12.06.2018 10:08

очистить и перестроить решение может не заменить все библиотеки DLL из выходного каталога.

я предлагаю попробовать переименовать папку с «bin» в «oldbin» или «obj» в «oldobj»

а затем попробуйте снова построить силюцию.

Если вы используете какие-либо сторонние библиотеки DLL, которые вам нужно будет скопировать во вновь созданную папку «bin» или «obj» после успешной сборки.

надеюсь, это сработает для вас.

Проблема со мной заключалась в том, что были старые dll dployed, которые были удалены в новой сборке. Чтобы исправить это, я просто установил флажок, чтобы удалить дополнительные файлы в месте назначения при публикации. Удалить дополнительные файлы в месте назначения

Если вы когда-нибудь получите сообщение об ошибке типа «Определение манифеста обнаруженной сборки не соответствует ссылке на сборку» и если вы обновились через Проект> Управление пакетами NuGet и вкладка "Обновление" в VS, первое, что вы можете сделать, это попробовать установить другую версию пакета после проверки версий из Страница галереи NuGet и выполнения следующей команды из консоли диспетчера пакетов:

PM> Install-Package YourPackageName -Version YourVersionNumber 
//Example
PM> Install-Package Microsoft.Extensions.FileProviders.Physical -Version 2.1.0

Хотя ответ не имеет прямого отношения к рассматриваемому пакету и был задан давно, он носит общий характер, все еще актуален и надеюсь, что он кому-то поможет.

Упоминалась ли аналогичная проблема в этом посте «Есть предложения, как мне выяснить, на что ссылается эта старая версия этого DLL-файла?»

Требуется, какая сборка по-прежнему относится к старому клиенту ODATA 6.15.0, ildasm помог мне сузить круг вопросов (без доступа к базовому коду, только через развернутый pkg на сервере).

Снимок экрана ниже для краткого обзора.

DeveloperPackge, если у вас нет ildasm.exe https://www.microsoft.com/net/download/visual-studio-sdks

ildasm usage to resolve assembly mismatch issue

Я собираюсь поразить всех прямо сейчас. . .

Удалите все ссылки <assemblyBinding> из файла .config, а затем запустите эту команду из консоли диспетчера пакетов NuGet:

Get-Project -All | Add-BindingRedirect

У меня тоже сработало. Спасибо

Oleh Udovytskyi 01.04.2019 17:15

ты сэкономил мне время ??

Abdu Imam 25.04.2019 13:44

это работает, только когда формат управления пакетами - packages.config, если вы используете 2017 csproj без packages.config, он работает :(

ManiVI 22.06.2019 03:41

Разум официально взорван

BGilman 29.10.2019 18:33

Я считаю, что проекты csproj нового стиля будут автоматически генерировать перенаправления привязки в файлах app.config при сборке (перенаправления не нужно добавлять в файлы проекта app.config, но они будут существовать на выходе).

Mike Rosoft 02.07.2020 10:39

Я обновлял этот продукт с течением времени ... иногда нужно просто смыть артефакты и переделать. Я думаю, что единственное, что я мог бы сделать иначе, - это создать новый проект и вручную выбрать в него элементы ... эта команда избавила меня от этого ... Когда-нибудь мне придется выплатить технический долг? Может быть, но не сегодня зло.

Hunter-Orionnoir 20.01.2021 08:39

Эта же ошибка возникла у меня в моем проекте модульных тестов и привела к сбою некоторых тестов. Я дважды проверил, какую версию сборки я использовал в проводнике сборок, проверил содержимое тегов runtime / independentassembly и понял, что там все еще есть ссылка на другую версию сборки, которую я использовал. Поскольку это была единственная директива в моем тестовом проекте app.config, я просто попытался удалить весь файл app.config, перестроить решение, и это помогло! Больше никаких справочных ошибок для меня :)

Я получал:

Could not load file or assembly 'XXX-new' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Это произошло потому, что я изменил название сборки с XXX.dll на XXX-new.dll. Возврат имени к исходному устранил ошибку.

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

Получилось у меня за System.ValueTuple

Unexpected Error Could not load file or assembly 'System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.

Решил, установив .NET Framework 4.7.2 Runtime на машину, на которой произошла ошибка. Просто и не нужно добавлять bindingRedirect, изменять GAC или понижать пакеты NuGet и т. д.

https://dotnet.microsoft.com/download/dotnet-framework/net472

У меня не сработало ни одно решение. Я попробовал очистить проект, удалить корзину, обновить пакет, перейти на более раннюю версию и так далее ... Через два часа я загрузил App.config по умолчанию из проекта со сборками, и там я изменил неправильную эталонную версию с:

<dependentAssembly>
    <assemblyIdentity name = "Microsoft.IdentityModel.Logging" publicKeyToken = "31bf3856ad364e35" culture = "neutral" />
    <bindingRedirect oldVersion = "0.0.0.0-5.5.0.0" newVersion = "5.5.0.0" />
</dependentAssembly>

к:

<dependentAssembly>
    <assemblyIdentity name = "Microsoft.IdentityModel.Logging" publicKeyToken = "31bf3856ad364e35" culture = "neutral" />
    <bindingRedirect oldVersion = "0.0.0.0-3.14.0.0" newVersion = "5.5.0.0" />
</dependentAssembly>

После этого я очистил проект, построил его снова, и он заработал. Нет предупреждений - нет проблем.

Запустите код в отладчике Visual Studio. Пожалуйста, бегите, пока не получите исключение. Будет пользовательский интерфейс исключения Visual Studio. Пожалуйста, прочтите «Полная информация» / «Показать подробности» внизу Visual Studio Exception. В разделе Полные сведения / Показать подробности он сказал мне, что один из моих проектов (который относился к моему основному проекту, имеет другую версию Microsoft.IdentityModel.Clients.ActiveDirectory). В моем случае проект модульного тестирования вызывал мой проект. Мой проект модульного тестирования и мой проект имеют другую версию Microsoft.IdentityModel.Clients.ActiveDirectory. Я получаю ошибку во время выполнения, когда выполнялся мой модульный тест.

Я только что обновил версию своего проекта модульного тестирования той же версией основного проекта. У меня это сработало.

Что такое «Полная информация»?

Shay 16.10.2019 19:22

Начните отладку в Visual Studio. Visual Studio выдаст исключение при достижении фрагмента кода. См. «Показать подробности» в пользовательском интерфейсе исключений Visual Studio внизу. Я также отредактировал свой ответ, добавив больше деталей.

Vikrant 05.12.2019 21:36

У меня была аналогичная проблема, но у меня ничего не получилось.

Решение, которое сработало для меня, заключалось в удалении части publicKeyToken из файла проекта (YourProject.csproj) вручную.

Раньше было:

<Reference Include = "Utility, Version=0.0.0.0, Culture=neutral, PublicKeyToken=e71b9933bfee3534, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>dlls\Utility.dll</HintPath>
</Reference>

После изменения было:

<Reference Include = "Utility, Version=1.0.1.100, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>dlls\Utility.dll</HintPath>
</Reference>

Убедитесь, что SpecificVersion - это False.

Решил мою проблему таким образом с помощью грубой силы.

Я понял, что вручаю несколько копий DLL по всему решению и две разные версии.

Зашел в решение в проводнике, поискал проблемную DLL и удалил их все. Затем добавили ссылки на DLL обратно, используя одну версию DLL.

Некоторое время я был в тупике. Я мог собрать и запустить в выпуске, не смог отладить из-за ссылки, которая не соответствовала манифесту. Я, должно быть, сотни раз проверял ссылки и удалил все библиотеки DLL. Я заметил, что сгенерированный манифест при отладке и выпуске отличается.

Я удалил app.manifest в своем проекте / свойствах, и проблема была устранена. Это не включало упоминания о вызывающих нарушение ссылках DLL - поэтому я не знаю, почему это вызывало проблему.

Попробовав многие из вышеперечисленных решений без каких-либо исправлений, нужно было убедиться, что в вашем приложении в Visual Studio включен параметр «Автоматическое создание перенаправления привязки».

Более подробную информацию о включении автоматического перенаправления привязки можно найти здесь: https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection

Попробуйте удалить ссылку на сборку из своего веб-файла Config / appConfig.

 <dependentAssembly>
        <assemblyIdentity name = "System.IO" publicKeyToken = "B03F5F7F11D50A3A" culture = "neutral" />
        <bindingRedirect oldVersion = "0.0.0.0-4.1.2.0" newVersion = "4.3.0.0" />
      </dependentAssembly>

Общий ответ на эту проблему - использовать перенаправления привязки, как и в других ответах. Однако это только часть проблемы - вам нужно знать правильную версию файла сборки, который вы используете. Свойства Windows не всегда точны, и nuget также не всегда точен.

Единственный способ получить правильную информацию о версии - это проанализировать сам файл. Один из полезных инструментов - dotPeek. По моему опыту, имя сборки, указанное в dotPeek, всегда является точным.

Так, например, правильная привязка для этого файла следующая:

<dependentAssembly>
    <assemblyIdentity name = "System.ComponentModel.Annotations" publicKeyToken = "b03f5f7f11d50a3a" culture = "neutral"/>
    <bindingRedirect oldVersion = "0.0.0.0-4.2.1.0" newVersion = "4.2.1.0"/>
</dependentAssembly>

Проводник Windows говорит, что это файл 4.6.26515.06, nuget говорит, что это файл 5.0.0.0. dotPeek говорит, что это 4.2.1.0, и это версия, которая корректно работает в нашем программном обеспечении. Также обратите внимание, что открытый ключ и культура важны, и dotPeek также показывает эту информацию.

dotPeek vs Windows version information

Это довольно старый вопрос, и недавно у меня было такое же сообщение об ошибке с конвейерами Azure DevOps Yaml и Dotnet Core 3.1. Проблема была несколько иной, чем другие ответы, которые пытаются решить, поэтому я поделюсь своим решением.

У меня было решение со многими проектами для моих собственных пакетов nuget. Я случайно добавил тег версии в файлы * .csproj, например:

  <Project Sdk = "Microsoft.NET.Sdk">
  <PropertyGroup>
    <Version>1.0.0</Version>
  </PropertyGroup>

Я упаковал пакеты nuget для всех проектов, использующих Yaml, с помощью задачи DotnetCoreCLI @ 2:

 - task: DotNetCoreCLI@2
   displayName: 'pack'
   inputs:
     command: pack
     nobuild: true
     configurationToPack: 'Release'
     includesource: true
     includesymbols: true
     packagesToPack: 'MyNugetProject1.csproj;**/MyNugetProject2.csproj'
     versioningScheme: 'byEnvVar'
     versionEnvVar: 'GitVersion.SemVer'

Проблема заключалась в том, что версия в файлах * .csproj не соответствовала версии в переменной среды GitVersion.SemVer (заданной параметром input- «versionEnvVar»).

После удаления всех тегов <Version>1.0.0</Version> в файлах * .csproj сборка / версия файла для dll была автоматически назначена переменной среды, и как nuget, так и dll (сборка / версия файла) имели одинаковую версию, и проблема была решена.

У меня была такая же ошибка, но в моем случае я запускал собственный пакет nuget локально в другом проекте.

Для меня это исправило изменение версии пакета на версию, запрошенную в ошибке.

Пакет был в netstandard 2.1, а проект, запрашивающий пакет, был в netcore 3.1.

Возможно, у вас неправильные версии слепков в assemblyBinding попробуйте:

  1. Удалите все содержимое привязки сборки в web.config / app.config:
<assemblyBinding xmlns = "urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name = "Microsoft.Extensions.Logging.Abstractions" publicKeyToken = "adb9793829ddae60" culture = "neutral" />
    <bindingRedirect oldVersion = "0.0.0.0-3.1.3.0" newVersion = "3.1.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name = "Microsoft.Extensions.DependencyInjection" publicKeyToken = "adb9793829ddae60" culture = "neutral" />
    <bindingRedirect oldVersion = "0.0.0.0-3.1.3.0" newVersion = "3.1.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name = "System.ComponentModel.Annotations" publicKeyToken = "b03f5f7f11d50a3a" culture = "neutral" />
    <bindingRedirect oldVersion = "0.0.0.0-4.2.1.0" newVersion = "4.2.1.0" />
  </dependentAssembly>
</assemblyBinding>
  1. Введите в консоли диспетчера пакетов: Add-BindingRedirect.
  2. Сгенерированы все необходимые переадресации привязки
  3. Запустите ваше приложение и посмотрите, правильно ли оно работает. Если нет, добавьте любые отсутствующие перенаправления привязки, пропущенные консолью пакета.

Другие вопросы по теме