Autofacと多くの動的アセンブリ読み込みを使用している状況で、このエラーが発生しました。
Autofac解決操作の実行中に、ランタイムはアセンブリの1つをロードできませんでした。エラーメッセージはそれを不平を言った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>