如何确保 OpenXml 程序集不会与 SpreadsheetLight 发生冲突?

How to ensure that the OpenXml assembly doesn't cause a conflict with SpreadsheetLight?

我 Nugot SpreadsheetLight。为了随后使用它,我需要添加以下用法:

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
using SpreadsheetLight;

为了识别前两个 ("DocumentFormat"),我还需要微软的 NuGet "Open XML Format SDK"

我得到了最新版本,2.5

然而,即便如此,我还是收到了一条关于需要引用它的错误消息:

类型 'DocumentFormat.OpenXml.Spreadsheet.InlineString' 在未引用的程序集中定义。您必须添加对程序集的引用 'DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

这行 SpreadsheetLight 代码引发了消息:

sl.SetCellValue("A1", true); // "sl" is an SLDocument

因此,我从我的项目中删除了对 NuGot(版本 2.6.0.0,运行时版本 v4.0.30319)的引用,然后通过浏览到 C:\Program Files(x86)\Open 来添加回引用XML SDK\V2.0\lib 并选择 "DocumentFormat.OpenXml.dll"

然后我得到一个编译器警告:

发现同一依赖程序集的不同版本之间存在冲突。请在项目文件中将 "AutoGenerateBindingRedirects" 属性 设置为 true。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=294190

我注意到我从文件系统添加的 DLL 是 2.5.5631.0 版本,而作为参考安装的 NuGot 版本是 2.6.0.0 运行时版本也不同(v4 .0.30319是NuGetting安装的"Open XML Format SDK",但是我手动添加的DLL版本是2.5.5631.0,Runtime Version v4.0.30319

根据 this,我认为我应该通过将 <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects> 更改为 true 来编辑 .csproj 文件 - 但那里不存在 AutoGenerateBindingRedirects。

不知道要不要加,如果要加(其中"block")。我更喜欢谨慎行事并安抚警告引擎。如何确保 OpenXml 程序集不会导致冲突?

缓解警告(使其消失在日落中)是将 DocumentFormat.OpenXML 版本降级到版本 2.0.5022.0(运行时版本 v2.0.50727)

我发现了这一点,因为这段代码来自 "Hello World" 示例 here

SLDocument sl = new SLDocument();
sl.SetCellValue("A1", true);
. . .

...第一行失败,“无法加载文件或程序集 'DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一

因此,由于它需要 2.0 版,我删除了该文件的 2.5.5631.0,然后取而代之的是 NuGot "OpenXML SDK 2.0"。即版本 2.0.5022.0 和运行时版本 v2.0.50727

所以:毕竟不需要用神秘的布尔值 属性 更新项目文件。

不过,不得不使用旧版本的程序集让我有点头疼。

更新

"go retro" 与 DocumentFormat.OpenXml 的必要性得到证实 here

可以通过将 DocumentFormat.OpenXml 从版本 2.0.5022.0 重定向到更新版本,例如版本 2.5.5631.0 来解决问题。为此,应在 web.config 中添加新的 <dependentAssembly> 项:

<configuration>
  ...
  <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         ...
         <dependentAssembly>
            <assemblyIdentity name="DocumentFormat.OpenXml" publicKeyToken="31bf3856ad364e35"/>
            <bindingRedirect oldVersion="1.0.0.0-2.0.5022.0" newVersion="2.5.5631.0"/>
         </dependentAssembly>
      </assemblyBinding>
  </runtime>
  ...
<configuration>

Spreadsheetlight 与 DocumentFormat.OpenXml 2.5 自版本 3.4.5 一起使用:

”版本3.4.5 - 现在不再考虑 SmartTags(现在不是很聪明,是吗?;)。这意味着代码现在已准备好用于 Open XML SDK 2.5!是的,它现在可以与 Open XML SDK 2.5 一起使用(我提到过吗?哈哈)“

引用自:https://www.nuget.org/packages/SpreadsheetLight/