Wystąpił ten błąd w kontekście, w którym korzystałem z funkcji Autofac i dużej ilości dynamicznego ładowania zespołu.
Podczas wykonywania operacji rozpoznawania Autofac środowisko wykonawcze nie może załadować jednego z zestawów. Komunikat o błędzie narzekał, że Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. Symptomy występowały podczas działania na maszynie wirtualnej z systemem Windows Server 2012 R2, ale nie występowały na maszynach wirtualnych z systemem Windows 10 lub Windows Server 2016.
ImplementationAssembly
odwoływał się do System.Collections.Immutable
1.1.37 i zawierał implementacje IMyInterface<T1,T2>
interfejsu, który został zdefiniowany w osobnym DefinitionAssembly
. DefinitionAssembly
wymieniony System.Collections.Immutable
1.1.36.
Metody, z IMyInterface<T1,T2>
których „nie zaimplementowano”, miały parametry typu IImmutableDictionary<TKey, TRow>
zdefiniowane w System.Collections.Immutable
.
Rzeczywista kopia System.Collections.Immutable
znaleziona w katalogu programu to wersja 1.1.37. Na mojej maszynie wirtualnej z systemem Windows Server 2012 R2 GAC zawierał kopię System.Collections.Immutable
1.1.36. W systemach Windows 10 i Windows Server 2016 GAC zawierał kopię System.Collections.Immutable
1.1.37. Błąd ładowania wystąpił tylko wtedy, gdy GAC zawierał starszą wersję biblioteki DLL.
Tak więc główną przyczyną niepowodzenia ładowania zestawu były niedopasowane odwołania System.Collections.Immutable
. Definicja interfejsu i implementacja miały identycznie wyglądające sygnatury metod, ale w rzeczywistości zależały od różnych wersji System.Collections.Immutable
, co oznaczało, że środowisko wykonawcze nie uznało klasy implementacji za zgodną z definicją interfejsu.
Dodanie następującego przekierowania wiązania do mojego pliku konfiguracyjnego aplikacji naprawiło problem:
<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>