在OOXML中使用大二进制段的问题

时间:2020-03-06 14:52:03  来源:igfitidea点击:

系统描述

使用OOXML生成文档的绘图组件。

绘图组件由几个部分组成。
除OOXML文档的接口外,所有部分均以C ++的exe + dll格式编写。
后一个组件是在C#/。NET中创建的COM组件。这样做的主要原因是.NET框架包含System.IO.Packaging。这是用于处理OOXML文档的非常方便的内置工具。

我们从模板OOXML文档中创建一个文档,其中某些零零碎碎的内容被其实际内容代替。

这些位之一是OLE服务器组件。基本上,这是OOXML文件中的一个二进制段。为了编写此二进制段,包装组件显然使用隔离存储。

问题

写入大于8MB的段将导致引发异常"无法确定域的身份"。

在C ++方面,此异常包含错误ISS_E_ISOSTORE(0x80131450)。

我们已经分析了此问题,并且据我们所知,这是一项安全功能,可以防止半不信任的第三方组件通过写入大量文件来完全破坏HD。

然后,我们在.NET / COM组件中尝试了很多事情(创建自定义AppDomain,设置最大许可性的属性,创建我们自己的流并将它们传递给Packaging组件),但是每次都导致抛出相同的异常。

我们可以做些什么来使这项工作呢?

可能是当.NET组件实例化为COM组件时,其AppDomain始终不受信任吗?

解决方案

我们应该更改该问题的标题,因为问题与OOXML不相关。

除此之外:我们正在使用哪个系统处理8MB的数据块,因此有硬盘总容量的风险?

我们可以尝试自己解压缩该包(而不是使用.NET包API),直接写入代表二进制段的文件,然后再次将其压缩。