系统描述
使用 OOXML 生成文档的绘图组件。
绘图组件由几个部分组成。除了 OOXML 文档的接口外,所有部分都用 C++ 编写为 exe + dll。后一个组件是在 C#/.NET 中创建的 COM 组件。主要原因是 .NET 框架包含System.IO.Packaging。这是一个非常方便的内置工具,用于处理 OOXML 文档。
我们从模板 OOXML 文档中创建一个文档,其中某些点点滴滴被它们的实际内容替换。
这些位之一是 OLE 服务器组件。基本上,这是 OOXML 文件中的二进制段。为了编写这个二进制段,Packaging 组件显然使用了隔离存储。
问题
写入大于 8MB 的段会导致抛出异常“无法确定域的身份”。
在 C++ 端,此异常包含错误 ISS_E_ISOSTORE (0x80131450)。
我们已经对此进行了分析,据我们所知,这是一项安全功能,可防止半不受信任的第三方组件通过编写大量文件来完全破坏您的 HD。
然后,我们在 .NET/COM 组件中尝试了很多东西(创建自定义 AppDomain,设置属性以获得最大许可,创建我们自己的 Streams 并将它们传递给 Packaging 组件),但每次都会引发相同的异常。
我们可以做些什么来完成这项工作?
难道当.NET组件被实例化为COM组件时,它的AppDomain总是不可信的?