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

3
微软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压缩和解压缩。
我的目标是使用类似于7-Zip的东西压缩资源,将它们存储在构建的程序集(.exe)中,然后解压缩并加载它们。我知道如何使用7-Zip SDK进行解压缩。因此,我有两个问题:
  1. 如何将OpenXML SDK程序集(.dll)加载到正在运行的.NET进程中,而无需将其写入磁盘?假设我有一个未压缩字节的byte[],我会自己处理资源打包到可执行文件中。

  2. 如何告诉程序集从内存加载OpenXML模式(DocumentFormat.OpenXml.xml),而不必将其写入磁盘?假设我有一个包含未压缩XML的byte[]或字符串。同样,我会自己处理解压缩和资源打包。


嘿,如果代码没有文档记录,那还有什么用呢,对吧?:D - Ярослав Рахматуллин
2个回答

3
使用适当的重载方法Assembly.Load以在解压缩到byte[]后加载。 DocumentFormat.OpenXML.xml文件对于应用程序执行并不是必需的,仅仅是为开发人员提供API文档。它被Visual Studio用来在Intellisense中显示信息。

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


谢谢,但我最终使用了dynamic关键字来进行后期绑定,在我的原始方法中需要手动解压缩。感谢您提供有关XML文件的信息。一旦意识到这使我的代码变得笨拙且难以维护,我发现.NETZ可以完全按照我想要的方式执行,而无需修改自己的代码。 - allquixotic

1
假设在安装过程中无法简单地将dll文件与可执行文件解压在一起(这是最简单的选项),我建议研究Assemby.Load(byte[])
至于DocumentFormat.OpenXml.xml,我不熟悉它,但我所发现的是它只需要用于开发,而不是部署。

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