如何在Mono2.10中引用DocumentFormat.OpenXml.dll?

33

我正在使用C#.net Windows桌面应用程序。我希望在其他平台上运行这些应用程序,因此我正在使用Mono 2.10作为交叉编译器。在运行时,我的应用程序出现了错误消息:

错误:无法打开所选文件夹。
无法加载文件或程序集'DocumentFormat.OpenXml.dll, version=2.0.5022.0, culture=neutral, PublicKeyToken=31bf3856ad364e35'或其某个依赖项。

我不知道问题出在哪里...我已经在c:\program files\open xml sdk\v2\lib\DocumentFormat.OpenXml.dll安装了openxml sdk2.0。

并且也将我的应用程序eXe放在相同的位置进行测试...

请指导我解决这个问题...

10个回答

22

作为一个新手,这是我所做的:

我在使用MS Visual Studio 2010 Pro。

  1. 下载并安装OpenXML SDK
  2. 在Visual Studio中的我的项目中,选择“项目”,然后选择“添加引用”
  3. 选择“浏览”选项卡
  4. 在“查找:”下拉菜单中,导航到: C:\ Program Files(x86)\ Open XML SDK \ V2.0 \ lib,并选择“DocumentFormat.OpenXml.dll”
  5. 点击确定
  6. 在“解决方案资源管理器”(对我来说在右侧),现在“引用”文件夹显示了DocumentFormat.OpenXML库。
  7. 右键单击它,然后选择属性
  8. 在属性面板中,将“复制本地”更改为“True”。

现在,您可以使用DocumentFormat类了。


21

您还应确保设置对WindowsBase的引用。这是使用SDK所必需的,因为它处理System.IO.Packaging(用于解压缩和打开压缩的.docx/.xlsx/.pptx文件作为OPC文档)。


1
我已经通过项目资源管理器窗口在C#.Net(4.0)中设置了WindowsBase的引用。但是我仍然无法解决这个问题...接下来该怎么办? - Saravanan
1
如果您的解决方案中有多个项目,请尝试将其包含到其他项目中。也许您正在将其包含到错误的项目中。 - merdan
谢谢。我没有指定 System.IO.Packaging - slayernoah
很奇怪,用户遇到了运行时错误。一旦您开始尝试在代码中使用SpreadsheetDocument等类,编译器本身就会开始出错。在运行时,它应该从.Net Framework的全局程序集缓存(GAC)中选择WindowsBase.dll - RBT

7

在引用中选择 DocumentFormat.OpenXml,查看其属性,并将“复制本地”选项设置为 True,以便将其复制到输出文件夹。这对我有效。


7
前往Nuget包管理器并搜索openxml。然后安装DocumentFormat.OpenXml。

3

我的做法:

  1. 在项目中添加一个名为ThirdParty的文件夹。
  2. ThirdParty文件夹中添加DocumentFormat.OpenXML.dllWindowsBase.dll两个文件。
  3. 确保该项目使用ThirdParty文件夹作为这两个DLL文件的引用。
  4. 构建并发布到外部服务器。

1
在我的应用程序中,我只需要在.Net选项卡下添加对“DocumentFormat.OpenXml”的引用,这两个引用(DocumentFormat.OpenXml和WindowsBase)总是自动添加的。但它们不包含在Bin文件夹中。因此,当应用程序发布到外部服务器时,我总是手动将DocumentFormat.OpenXml.dll放在Bin文件夹中。或者将引用的“Copy Local”属性设置为true。

1
我在VisualStudio 2017中使用此解决方案成功地应用于网站项目。目前,我将.net参考程序集从<系统驱动器>\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework<所需的.net版本><dllname>.dll复制到我的网站的/bin文件夹中。 - qxotk

0

您需要将DocumentFormat.OpenXML.dll放置在应用程序的同一文件夹中,或者如果您正在开发ASP.NET应用程序,则放置在'bin'路径中。但是,我不确定OpenXML SDK是否支持非Windows操作系统-您可能需要寻找第三方解决方案。

是的,这个答案是正确的,唯一的区别是您将.dll复制到项目的bin文件夹中。


0

在查看并将属性更改为DocumentFormat.OpenXml之后,我还需要将Specific Version更改为false。


0
对我来说问题是在我的Win7开发机上全局程序集缓存(GAC)中存在DocumentFormat.OpenXml.dll。因此,当我在VS2013中发布项目时,它会在GAC中找到该文件,因此省略了将其复制到发布文件夹的步骤。
解决方案:从GAC中删除DLL。
  1. 在Windows资源管理器中打开GAC根目录(Win7:%windir%\Microsoft.NET\assembly
  2. 搜索OpenXml
  3. 删除任何适当的文件夹(或为安全起见,将它们剪切到桌面以防需要恢复它们)
可能有更合适的方法来删除GAC文件(如下所示),但这就是我所做的,而且它有效。 gacutil -u DocumentFormat.OpenXml.dll 希望能有所帮助!

0
我发现当与PCL库混合使用时,上述问题会出现。虽然WindowsBase库包含System.IO.Packaging,但我正在使用OpenXMLSDK-MOT 2.6.0.0库,它本身提供了自己的物理System.IO.Packaging库副本。在C#项目中,我找到了我缺少的引用,如下所示:
<Reference Include="System.IO.Packaging, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
  <HintPath>..\..\..\..\packages\OpenXMLSDK-MOT.2.6.0.0\lib\System.IO.Packaging.dll</HintPath>
  <Private>True</Private>
</Reference>

我将XMLSDK版本降级到2.6,这似乎为我解决了这个问题。但是你可以看到有一个物理程序集System.IO.Packaging.dll


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接