【问题标题】:How to ensure that the OpenXml assembly doesn't cause a conflict with SpreadsheetLight?如何确保 OpenXml 程序集不会与 SpreadsheetLight 发生冲突?
【发布时间】:2016-03-22 21:31:11
【问题描述】:

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

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

要识别前两个(“DocumentFormat”),我还需要 NuGet Microsoft 的“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。

我不知道我是否应该添加它,如果是的话(在哪个“块”中)。我更喜欢安全地玩它并缓解警告引擎。如何确保 OpenXml 程序集不会引起冲突?

【问题讨论】:

    标签: nuget openxml openxml-sdk csproj spreadsheetlight


    【解决方案1】:

    缓解该警告(使其进入日落)是将 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

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

    不过,这让我不得不使用旧版本的程序集。

    更新

    证实了使用 DocumentFormat.OpenXml “复古”的需要here

    【讨论】:

    • 我昨天正在为此苦苦挣扎。我确实尝试了几个不同的版本,所以我认为你的答案实际上是正确的——降级到非最新版本。但是,直到我也修改了我的 app.config 文件,它才对我有用。它有一个dependentAssembly 元素,将 DocumentFormat.OpenXml 版本 0.0.0.0-2.5.5631.0 映射到 2.5.5631.0。我认为这是由我所做的各种 nuget 操作之一添加的。删除该元素后,我的代码就可以工作了。 (BTW fantods、nugot 和 assuaging 都是好词!)
    • “Fantods”来自吐温;不记得是在“汤姆索亚”还是“哈克芬”中,还是两者兼而有之。
    【解决方案2】:

    可以通过将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>
    

    【讨论】:

    • 遗憾的是并没有解决问题:(在生成文件时它会在某些命令中引发错误,对我来说它在执行“myExcelFile.SaveAs(”时失败,我找到的唯一解决方案是“去复古”并像 B. Clay 一样使用 OpenXML SDK 2.0。
    • @JCO9:您确定您尝试使用正确的 32/64 位程序集吗?你到底得到了什么错误?安装了哪个 .Net 运行时?您是否尝试使用Fusion Log Viewer 来调试问题?一个问题可能有不同的原因。调试并不简单。
    【解决方案3】:

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

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

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

    【讨论】:

    • 对于使用 NuGet(仅升级到 SpreadsheetLight v3.4.11)的未来搜索者,只有 DocumentFormat.OpenXml 2.5 有效。我尝试了 DocumentFormat.OpenXml 的所有更高版本,但都失败并出现相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2014-12-16
    相关资源
    最近更新 更多