Я столкнулся с этой ошибкой в контексте, где я использовал Autofac и много динамической загрузки сборки.
При выполнении операции разрешения Autofac среда выполнения не сможет загрузить одну из сборок. Сообщение об ошибке жаловалось, что Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. Симптомы возникали при работе на виртуальной машине 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 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>