我在使用 Autofac 和大量动态程序集加载的上下文中遇到了这个错误。
在执行 Autofac 解析操作时,运行时将无法加载其中一个程序集。错误消息抱怨说Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. 这些症状在 Windows Server 2012 R2 VM 上运行时出现,但在 Windows 10 或 Windows Server 2016 VM 上没有出现。
ImplementationAssembly
引用System.Collections.Immutable
1.1.37,并包含接口的实现,该IMyInterface<T1,T2>
接口在单独的DefinitionAssembly
. DefinitionAssembly
参考System.Collections.Immutable
1.1.36。
IMyInterface<T1,T2>
“未实现”的方法具有类型为 的参数IImmutableDictionary<TKey, TRow>
,该参数在System.Collections.Immutable
.
在程序目录中找到的实际副本System.Collections.Immutable
是 1.1.37 版。在我的 Windows Server 2012 R2 VM 上,GAC 包含System.Collections.Immutable
1.1.36 的副本。在 Windows 10 和 Windows Server 2016 上,GAC 包含System.Collections.Immutable
1.1.37 的副本。仅当 GAC 包含旧版本的 DLL 时才会发生加载错误。
因此,程序集加载失败的根本原因是对System.Collections.Immutable
. 接口定义和实现具有相同的方法签名,但实际上依赖于不同的版本System.Collections.Immutable
,这意味着运行时不会考虑实现类与接口定义匹配。
将以下绑定重定向添加到我的应用程序配置文件解决了该问题:
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.1.37.0" newVersion="1.1.37.0" />
</dependentAssembly>