c# - 在 .NET 可执行文件中嵌入 OpenXML SDK 文件

标签 c# compression embedded-resource openxml-sdk

Microsoft OpenXML SDK 2.0 版附带一个约 5111 KiB 的 .NET 程序集 (DLL) 和一个约 14436 KiB 的未压缩 XML 文件。 这两个都是成功使用 SDK 所必需的。(重要更新:只需要 DLL 文件;XML 只是程序员的 API 文档!!)

我使用可用的 SDK 编写了一个程序,我对它很满意。但是,我使用 LZMA2 压缩了 OpenXML SDK 数据(DLL 和 XML),结果只有 1287 KiB。节省了 18260 KiB,这可能需要至少几秒钟,最多几分钟才能通过普通 WAN 链接进行传输。

我从 7-zip.org 下载了 LZMA SDK它在大约 45 KiB 的已编译 MSIL 中实现了 LZMA 压缩和解压缩(由 .NET Framework 4.0 编译)。

我的目标是压缩资源(使用 7-Zip 之类的东西),将它们存储在构建的程序集 (.exe) 中,然后解压缩并加载它们。我知道如何使用 7-Zip SDK 进行解压。因此我有两个问题:

  1. 如何在不将其写入磁盘的情况下将 OpenXML SDK 程序集 (.dll) 加载到正在运行的 .NET 进程中?假设我有 DLL 的未压缩字节的 byte[];我会自己负责将资源打包到可执行文件中。

  2. 如何让程序集从内存中加载 OpenXML 架构 (DocumentFormat.OpenXml.xml) 而无需将其写入磁盘?假设我有一个包含未压缩 XML 的 byte[] 或字符串。再次说明,我会自己负责解压和资源打包。

最佳答案

解压到byte[]后,使用适当的Assembly.Load重载。 DocumentFormat.OpenXML.xml 文件不是应用程序执行所必需的。它只是开发人员的 API 文档。 Visual Studio 使用它在 Intellisense 中显示信息。

您应该使 dll(或压缩的 dll)成为嵌入式资源,并使用 AppDomain.AssemblyResolve 事件在请求时加载 SDK。 here 有一些示例代码.

关于c# - 在 .NET 可执行文件中嵌入 OpenXML SDK 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15553315/

相关文章:

c# - 将文字编码不正确的字符串(例如 "ñ")转换为 ISO-8859-1 (Latin1) H

c# - 从循环中创建唯一字符串列表的最快方法?

压缩棋局

java - 如何设置JGoodies Look and Feel?

c# - MyProject.resources 上的 FileNotFoundException

c# - Linq XML 不会选择指定的 xml 元素

c# - 在 .net 中转换期间对象会发生什么变化?

css - 压缩 CSS YUI 压缩器

java - 为什么我从 gif 文件转换的 jpg 文件不清晰?

c# - 如何在多个 RDLC 报告中共享和嵌入图像