通过MSI安装后,Excel加载项的导入的Nuget程序包未绑定到引用的.dll

时间:2018-07-05 01:20:35

标签: .net excel nuget

我们最近在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安装,我们仍然会遇到相同的问题。

2 个答案:

答案 0 :(得分:1)

我认为可以使用新的Nuget软件包解决此问题,该软件包可以确保SKGLExtesion引用Newton.Json的Nuget版本,而不是以前的本地软件包。

答案 1 :(得分:0)

在用完所有选项之后,很遗憾,我们不得不删除对SKGLExtension包的nuget引用。幸运的是,我们能够针对Newtonsoft.Json软件包版本11从源代码编译SKGL库,从而解决了该问题。不过,找到更好的解决方案本来很好