Мы недавно обновили Newtonsoft.JSON и еще один пакет Nuget, SKGLExtension, для наших надстроек WPF и Excel.
Все наши проекты, на которые есть ссылки, используют пакет nuget Newtonsoft.JSON.dll версии 11.0.0.
И продукты WPF, и Excel ссылаются на DLL-файл движка, который затем ссылается на SKGLExtension, использующий Newtonsoft.JSON.dll.
Когда надстройка Excel установлена через MSI и запущена, мы получаем эту ошибку привязки:
System.IO.FileLoadException: «Не удалось загрузить файл или сборку
'Newtonsoft.Json, версия = 6.0.0.0, культура = нейтральная,
PublicKeyToken = 30ad4fe6b2a6aeed 'или одна из его зависимостей.
определение манифеста расположенной сборки не соответствует сборке
ссылка. (Исключение из HRESULT: 0x80131040) '
=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
(Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/Foo/Bar/
LOG: Initial PrivatePath = NULL
Calling assembly : SKM, Version=4.0.3.1, Culture=neutral, PublicKeyToken=30182975912ff1ef.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Foo/Bar/Newtonsoft.Json.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Из этой строки кода в нашем движке dll:
localKey = SKGL.SKM.LoadKeyInformationFromFile(keyPath, True, False)
Строке предшествует оператор test, вызывающий Newtonsoft.Json.JsonSerializer, который отлично работает.
При запуске из отладки Visual Studio надстройка работает нормально.
Когда проект WPF установлен через MSI, приложение WPF работает нормально.
В папке установки версия Newtonsoft.JSON.dll - 11.0.2.21924. Это то же самое для чистой установки на машине, на которой она никогда не была установлена.
Наш файл Bar.dll.config содержит XML, вставленный процессом установки nuget для перенаправления существующих ссылок:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
В GAC нет ни Newtonsoft, ни SKGLExtension.
Для всех ссылок в нашем коде флаг Require Specific Version установлен в False.
Были очищены как пакеты решения, так и папка пакетов пользователя. Все сборки выполняются как полностью чистые, так и сборки.
Если я попытаюсь скопировать dll из установки WPF в установку Excel, мы все равно получим ту же проблему.