我们最近在WPF和Excel加载项产品中更新了Newtonsoft.JSON和另一个Nuget程序包SKGLExtension。
我们所有引用的项目都使用Newtonsoft.JSON.dll版本11.0.0 nuget包。
WPF和Excel产品都引用了一个引擎.dll,该引擎随后引用了使用Newtonsoft.JSON.dll的SKGLExtension。
通过MSI安装并运行Excel加载项时,我们收到以下绑定错误:
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)
该行之前有一个称为Newtonsoft.Json.JsonSerializer的测试语句,该语句工作正常。
从Visual Studio调试启动时,加载项工作正常。
通过MSI安装WPF项目时,WPF应用程序可以正常工作。
在安装文件夹中,Newtonsoft.JSON.dll的版本为11.0.2.21924。对于在以前从未安装过的计算机上进行全新安装,这是相同的。
我们的Bar.dll.config包含nuget安装过程插入的xml,以重定向现有引用:
<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安装,我们仍然会遇到相同的问题。
答案 0 :(得分:1)
我认为可以使用新的Nuget软件包解决此问题,该软件包可以确保SKGLExtesion引用Newton.Json的Nuget版本,而不是以前的本地软件包。
答案 1 :(得分:0)
在用完所有选项之后,很遗憾,我们不得不删除对SKGLExtension包的nuget引用。幸运的是,我们能够针对Newtonsoft.Json软件包版本11从源代码编译SKGL库,从而解决了该问题。不过,找到更好的解决方案本来很好