Ho riscontrato questo errore in un contesto in cui stavo usando Autofac e un sacco di caricamento dinamico dell'assembly.
Durante l'esecuzione di un'operazione di risoluzione Autofac, il runtime non caricava uno degli assembly. Il messaggio di errore si lamentava che Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. I sintomi si sono verificati durante l'esecuzione su una macchina virtuale Windows Server 2012 R2, ma non si sono verificati su macchine virtuali Windows 10 o Windows Server 2016.
ImplementationAssembly
referenziato System.Collections.Immutable
1.1.37 e conteneva implementazioni di IMyInterface<T1,T2>
un'interfaccia, che è stata definita in modo separato DefinitionAssembly
. DefinitionAssembly
riferimentoSystem.Collections.Immutable
1.1.36.
I metodi da IMyInterface<T1,T2>
cui "non sono stati implementati" avevano parametri di tipo IImmutableDictionary<TKey, TRow>
, che è definito inSystem.Collections.Immutable
.
La copia effettiva di System.Collections.Immutable
trovato nella directory del programma era la versione 1.1.37. Sulla mia macchina virtuale Windows Server 2012 R2, il GAC conteneva una copia di System.Collections.Immutable
1.1.36. Su Windows 10 e Windows Server 2016, il GAC conteneva una copia diSystem.Collections.Immutable
dell'1.1.37. L'errore di caricamento si è verificato solo quando GAC conteneva la versione precedente della DLL.
Pertanto, la causa principale dell'errore di caricamento dell'assembly è stata la mancata corrispondenza dei riferimenti System.Collections.Immutable
. La definizione e l'implementazione dell'interfaccia avevano firme dei metodi dall'aspetto identico, ma in realtà dipendevano da diverse versioni diSystem.Collections.Immutable
, il che significava che il runtime non considerava la classe di implementazione corrispondente alla definizione dell'interfaccia.
L'aggiunta del seguente reindirizzamento di associazione al mio file di configurazione dell'applicazione ha risolto il 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>