Я столкнулся с этой ошибкой в контексте, где я использовал 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. На моей виртуальной System.Collections.Immutable
машине Windows Server 2012 R2 GAC содержал копию 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>