Ich bin auf diesen Fehler in einem Kontext gestoßen, in dem ich Autofac und viel dynamisches Laden von Baugruppen verwendet habe.
Während einer Autofac-Auflösungsoperation konnte die Laufzeit eine der Assemblys nicht laden. Die Fehlermeldung beschwerte sich darüber Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. Die Symptome traten auf, wenn sie auf einer Windows Server 2012 R2-VM ausgeführt wurden, jedoch nicht auf Windows 10- oder Windows Server 2016-VMs.
ImplementationAssembly
referenziert System.Collections.Immutable
1.1.37 und enthielt Implementierungen einer IMyInterface<T1,T2>
Schnittstelle, die in einem separaten definiert wurde DefinitionAssembly
. DefinitionAssembly
referenziert System.Collections.Immutable
1.1.36.
Die Methoden, von IMyInterface<T1,T2>
denen "nicht implementiert" wurden, hatten Parameter vom Typ IImmutableDictionary<TKey, TRow>
, der in definiert istSystem.Collections.Immutable
.
Die tatsächliche Kopie von System.Collections.Immutable
im Programmverzeichnis gefunden wurde Version 1.1.37. Auf meiner Windows Server 2012 R2-VM enthielt der GAC eine Kopie von System.Collections.Immutable
1.1.36. Unter Windows 10 und Windows Server 2016 enthielt der GAC eine Kopie vonSystem.Collections.Immutable
1.1.37. Der Ladefehler trat nur auf, wenn der GAC die ältere Version der DLL enthielt.
Die Hauptursache für den Fehler beim Laden der Baugruppe waren also die nicht übereinstimmenden Verweise auf System.Collections.Immutable
. Die Schnittstellendefinition und -implementierung hatte identisch aussehende Methodensignaturen, hing jedoch tatsächlich von verschiedenen Versionen von abSystem.Collections.Immutable
, was bedeutete, dass die Laufzeit die Implementierungsklasse nicht als mit der Schnittstellendefinition übereinstimmend betrachtete.
Das Hinzufügen der folgenden Bindungsumleitung zu meiner Anwendungskonfigurationsdatei hat das Problem behoben:
<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>