Отладка TypeLoadExceptions отражения

#c# #dll #azure-service-fabric

#c# #dll #azure-service-fabric

Вопрос:

Как мне отладить этот тип ошибки?

Проблемный файл System.Memory, версия = 4.0.1.1. Из того, что я вижу, у меня нет ссылок на этот файл ни в одном из моих проектов, и я проверил зависимости моих импортированных пакетов nuget, и ни один из них не ссылается на этот файл.

Почему загружается этот файл? К сожалению, ошибка, которая выдается в InvalidOperationException с ReflectionTypeLoadException, просто является сообщением. У меня нет доступа к выбрасываемой ошибке, поскольку она выбрасывается в DLL, к которой у меня нет доступа. Эта DLL является частью моей корпоративной среды.

У меня есть очень похожий проект, который использует те же библиотеки DLL Framework компании, у которых нет этой проблемы.

Ошибка:

Генерируется исключение: ‘System.InvalidOperationException’ в ****.dll Ошибки ReflectionTypeLoadException: [Не удалось загрузить файл или сборку ‘System.Память, версия = 4.0.1.1, Культура = нейтральная, PublicKeyToken = cc7b13ffcd2ddd51’ или одна из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)] [Не удалось загрузить файл или сборку ‘System.Memory, Version = 4.0.1.1, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)] [Не удалось загрузить файл или сборку ‘System.Memory, Version = 4.0.1.1, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)] [Не удалось загрузить файл или сборку ‘System.Memory, Version = 4.0.1.1, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)] [Не удалось загрузить файл или сборку ‘System.Memory, Version = 4.0.1.1, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51’ или одну из его зависимостей. Определение манифеста найденной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)]

Ошибка от Fuslogvw заключается в следующем:

 *** Assembly Binder Log Entry  (19/01/2021 @ 20:33:19) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:WindowsMicrosoft.NETFramework64v4.0.30319clr.dll
Running under executable  C:SfDevClusterData_App_Node_0*******.FabricAppType_App0********.FabricSvcPkg.Code.1.0.1**********.FabricSvc.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 (Fully-specified)
LOG: Appbase = file:///C:/SfDevCluster/Data/_App/_Node_0/******.FabricAppType_App0/******.FabricSvcPkg.Code.1.0.1/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = Prescriptions.Api.FabricSvc.exe
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:SfDevClusterData_App_Node_0*******.FabricAppType_App0******.FabricSvcPkg.Code.1.0.1******.FabricSvc.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFramework64v4.0.30319configmachine.config.
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/SfDevCluster/Data/_App/_Node_0/******.FabricAppType_App0/*******.FabricSvcPkg.Code.1.0.1/System.Memory.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:SfDevClusterData_App_Node_0*******.FabricAppType_App0*******.FabricSvcPkg.Code.1.0.1System.Memory.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
 

Комментарии:

1. Просмотр сборок (т. Е. С использованием ILSpy) и журнала слияния, как вы это делали, — правильные шаги. В качестве следующего шага расследования я бы добавил System.Memory NuGet и посмотрел, решит ли это проблему. Если да, это означает, что некоторые из зависимостей пропустили, чтобы добавить их в свой список зависимостей… Найдите его, тщательно проверив все сборки на наличие ссылок.

2. Это сделало это. Самая ранняя версия System.Memory, которую я смог получить из NuGet, была 4.4.0, а не для Framework. Итак, я проверил ссылки в 2 проектах-нарушителях в обозревателе решений и заметил System.Memory 4.0.1.0. Я раздражен тем, что не заметил, что, однако, удаление этой ссылки и добавление 4.0.1.1 сработали, и ошибка больше не возникает. Теперь мне нужно выяснить, какая из ссылок в проекте (не NuGet) использует 4.0.1.1 и удалить ее. Спасибо, что указали мне правильное направление.

Ответ №1:

Следуя инструкциям Алексея Левенкова:

Самая ранняя версия System.Memory, которую я смог получить из NuGet, была 4.4.0, а не для Framework. Итак, я проверил ссылки в 2 проектах-нарушителях в обозревателе решений и заметил System.Memory 4.0.1.0. Я раздражен тем, что не заметил, что, однако, удаление этой ссылки и добавление 4.0.1.1 сработали, и ошибка больше не возникает.

Теперь мне нужно выяснить, какая из ссылок в проекте (не NuGet) использует 4.0.1.1 и удалить ее.

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

ЖУРНАЛ: Имя сборки: System.Memory, версия = 4.0.1.0, Культура = нейтральная, PublicKeyToken = cc7b13ffcd2ddd51.

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