问题描述
我们有一个 .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 的二进制引用。
为什么会这样?这不应该是对版本 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 (将#修改为@)