【发布时间】:2021-04-24 05:10:11
【问题描述】:
如何调试此类错误?
问题文件是 System.Memory,版本=4.0.1.1。据我所知,我的任何项目中都没有引用此文件,并且我检查了导入的 nuget 包的依赖项,但没有一个引用此文件。
为什么要加载这个文件?令人沮丧的是,在 InvalidOperationException 中引发的错误与 ReflectionTypeLoadException 只是一条消息。我无权访问抛出的错误,因为它是在我无权访问的 DLL 中抛出的。该 DLL 构成了我公司框架的一部分。
我有一个非常相似的项目,它使用相同的公司框架 DLL,没有这个问题。
错误:
抛出异常:****.dll 中的“System.InvalidOperationException” ReflectionTypeLoadException 错误:[无法加载文件或程序集'System.Memory,Version=4.0.1.1,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)][无法加载文件或程序集“System.Memory,版本=4.0.1.1,文化=中性,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)][无法加载文件或程序集“System.Memory,版本=4.0.1.1,文化=中性,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)][无法加载文件或程序集“System.Memory,版本=4.0.1.1,文化=中性,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)][无法加载文件或程序集“System.Memory,版本=4.0.1.1,文化=中性,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:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable C:\SfDevCluster\Data\_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:\SfDevCluster\Data\_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:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.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:\SfDevCluster\Data\_App\_Node_0\*******.FabricAppType_App0\*******.FabricSvcPkg.Code.1.0.1\System.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.
【问题讨论】:
-
像您一样查看程序集(即使用 ILSpy)和 Fusion 日志是正确的步骤。作为调查的下一步,我将添加 System.Memory NuGet 并查看它是否可以解决问题。如果是,则意味着某些依赖项错过了将其添加到其依赖项列表中...通过仔细检查所有程序集的引用来寻找它。
-
做到了。我可以从 NuGet 获得的 System.Memory 的最早版本是 4.4.0,而不是 Framework。因此,我在解决方案资源管理器中检查了 2 个有问题的项目中的引用,并注意到 System.Memory 4.0.1.0。我很生气忽略了这一点,但是,删除该引用并添加 4.0.1.1 工作并且不再发生错误。现在我需要弄清楚项目中的哪些引用(不是 NuGet)使用 4.0.1.1 并将其删除。感谢您为我指明正确的方向。
标签: c# dll azure-service-fabric