J'ai rencontré cette erreur dans un contexte où j'utilisais Autofac et beaucoup de chargement d'assemblage dynamique.
Lors de l'exécution d'une opération de résolution Autofac, le runtime ne parviendrait pas à charger l'un des assemblys. Le message d'erreur s'est plaint de cela Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. Les symptômes se sont produits lors de l'exécution sur une machine virtuelle Windows Server 2012 R2, mais ne se sont pas produits sur les machines virtuelles Windows 10 ou Windows Server 2016.
ImplementationAssembly
référencé System.Collections.Immutable
1.1.37, et contenait des implémentations d'une IMyInterface<T1,T2>
interface, qui était définie dans un document séparé DefinitionAssembly
. DefinitionAssembly
référencé System.Collections.Immutable
1.1.36.
Les méthodes à partir IMyInterface<T1,T2>
desquelles n'étaient "pas implémentées" avaient des paramètres de type IImmutableDictionary<TKey, TRow>
, qui est défini dans System.Collections.Immutable
.
La copie réelle de System.Collections.Immutable
trouvée dans le répertoire du programme était la version 1.1.37. Sur ma machine virtuelle Windows Server 2012 R2, le GAC contenait une copie du System.Collections.Immutable
1.1.36. Sur Windows 10 et Windows Server 2016, le GAC contenait une copie du System.Collections.Immutable
1.1.37. L'erreur de chargement ne s'est produite que lorsque le GAC contenait l'ancienne version de la DLL.
Ainsi, la cause première de l'échec de la charge de l'assembly était les références incompatibles avec System.Collections.Immutable
. La définition et l'implémentation de l'interface avaient des signatures de méthode d'apparence identique, mais dépendaient en fait de différentes versions de System.Collections.Immutable
, ce qui signifiait que le runtime ne considérait pas la classe d'implémentation comme correspondant à la définition de l'interface.
L'ajout de la redirection de liaison suivante à mon fichier de configuration d'application a résolu le problème:
<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>