Encontré este error en un contexto en el que estaba usando Autofac y mucha carga de ensamblaje dinámico.
Al realizar una operación de resolución de Autofac, el tiempo de ejecución no podría cargar uno de los ensamblajes. El mensaje de error se quejó de eso Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. Los síntomas ocurrieron cuando se ejecutaba en una VM de Windows Server 2012 R2, pero no ocurría en las de Windows 10 o Windows Server 2016.
ImplementationAssembly
referenciado System.Collections.Immutable
1.1.37, y contenía implementaciones de una IMyInterface<T1,T2>
interfaz, que se definió en un separado DefinitionAssembly
. DefinitionAssembly
referenciadoSystem.Collections.Immutable
1.1.36.
Los métodos a partir de los IMyInterface<T1,T2>
cuales "no se implementaron" tenían parámetros de tipo IImmutableDictionary<TKey, TRow>
, que se definen enSystem.Collections.Immutable
.
La copia real de System.Collections.Immutable
encontrado en el directorio del programa fue la versión 1.1.37. En mi VM Windows Server 2012 R2, el GAC contenía una copia de System.Collections.Immutable
1.1.36. En Windows 10 y Windows Server 2016, el GAC contenía una copia de System.Collections.Immutable
1.1.37. El error de carga solo se produjo cuando el GAC contenía la versión anterior de la DLL.
Entonces, la causa raíz de la falla de carga del ensamblaje fueron las referencias que no coinciden System.Collections.Immutable
. La definición y la implementación de la interfaz tenían firmas de métodos de aspecto idéntico, pero en realidad dependían de diferentes versiones System.Collections.Immutable
, lo que significaba que el tiempo de ejecución no consideraba que la clase de implementación coincidiera con la definición de la interfaz.
Agregar el siguiente enlace de redireccionamiento al archivo de configuración de mi aplicación solucionó el problema:
<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>