Я зіткнувся з цією помилкою в контексті, коли я використовував Autofac та багато динамічного завантаження збірки.
Під час виконання операції з роздільною здатністю автофактора час виконання не вдасться завантажити одну з вузлів. Повідомлення про помилку скаржилося на це Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. Симптоми виникали під час роботи на VM для Windows Server 2012 R2, але не виникали у вітринах Windows 10 або Windows Server 2016.
ImplementationAssembly
з посиланням на System.Collections.Immutable
1.1.37 і містив реалізацію IMyInterface<T1,T2>
інтерфейсу, який був визначений окремо DefinitionAssembly
. DefinitionAssembly
посилання System.Collections.Immutable
1.1.36.
Методи, з IMyInterface<T1,T2>
яких «не було реалізовано», мали параметри типу IImmutableDictionary<TKey, TRow>
, що визначено в System.Collections.Immutable
.
Фактична копія System.Collections.Immutable
знайденого в каталозі програм була версією 1.1.37. У моєму Windows Server 2012 R2 VM GAC містив копію System.Collections.Immutable
1.1.36. В ОС Windows 10 та Windows Server 2016 GAC містив копію System.Collections.Immutable
1.1.37. Помилка завантаження сталася лише тоді, коли GAC містив старішу версію DLL.
Отже, першопричиною збою завантаження збірки було невідповідність посилань на System.Collections.Immutable
. Визначення та реалізація інтерфейсу мали однакові на вигляд підписи методу, але насправді залежали від різних версій System.Collections.Immutable
, що означало, що час виконання не вважає клас реалізації відповідним визначенню інтерфейсу.
Додавання наступного переадресації прив'язки до мого файлу конфігурації програми виправило проблему:
<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>