.NET 无法加载特定版本的程序集

问题描述

我们有一个 .NET Framework 4.6.2 应用程序,它(间接地,通过传递依赖)使用 NuGet 包 Microsoft.Extensions.DependencyInjection 版本 3.0.3

此 NuGet 包版本 3.0.3 包含 Microsoft.Extensions.DependencyInjection.dll 程序集版本 3.0.3。它还依赖于 NuGet 包 Microsoft.Extensions.DependencyInjection.Abstractions 3.0.3 版。这个“Abstractions”NuGet 包包含 Microsoft.Extensions.DependencyInjection.Abstractions.dll 和程序集版本 3.0.3。到目前为止,一切都很好。

但是:Microsoft.Extensions.DependencyInjection.dll 程序集版本 3.0.3 具有对 Microsoft.Extensions.DependencyInjection.Abstractions.dll 版本 3.0.0 的二进制引用。

enter image description here

为什么会这样?这不应该是对版本 3.0.3 的引用吗?我还检查了这些包/程序集 (3.1.16) 的较新版本,并在那里发现了同样的奇怪之处。

我之所以这么问是因为我们有一个应用程序的两个变体,它们都使用相同的 DLL 集。在一种变体中,它在运行时失败并显示错误,表明它无法加载 Microsoft.Extensions.DependencyInjection.Abstractions 程序集版本 3.0.0。我认为这个错误是意料之中的。在另一个变体中,它有效,但我无法解释原因。

没有任何应用程序在其 exe.config 文件中具有 Microsoft.Extensions.DependencyInjection 相关 DLL 的程序集重定向。这两个应用程序都针对 .NET Framework 4.6.2。据我所知,程序集和程序集引用是强命名的,因此程序集版本应该很重要。我们使用Assembly.LoadFrom(或类似的东西)来加载程序集。

我错过了什么? .NET CLR 会忽略程序集版本的第 3 位数字吗?是否有可以打开/关闭此行为的秘密开关?

我已经尝试使用 fuslogvw 来追踪错误,但没有成功。我刚刚注意到,对于工作变体,它写入以下文件

WhereRefBind!Host=(LocalMachine)!FileName=(Microsoft.Extensions.DependencyInjection.Abstractions.dll).HTM

这里是文件内容

*** Assembly Binder Log Entry  (30.06.2021 @ 10:51:04) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  D:\Builds\...\MyApplication.exe
--- A detailed error log follows. 

LOG: IJW explicit bind. File path:D:\Builds\...\Microsoft.Extensions.DependencyInjection.Abstractions.dll. 
LOG: IJW assembly bind returned the same manifest path.

非常感谢任何帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)