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

时间:2013-03-21 16:44:20

标签: 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 []或字符串。再说一次,我将自己处理减压和资源包装。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

假设您无法在安装过程中简单地解压缩可执行文件旁边的dll(这是迄今为止最简单的选项),我建议您查看Assemby.Load(byte[])

至于DocumentFormat.OpenXml.xml,我对它并不熟悉,但到目前为止我发现它只是开发所需而不是部署。