我们有一个 .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。此“抽象”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.
任何帮助真的很感激!