SystembeschreibungProblem unter Verwendung der große binäres Segments in OOXML
eine Auftragung Komponente, die OOXML ein Dokument zu erzeugen, verwendet.
Plotting-Komponente besteht aus mehreren Teilen. Alle Teile sind in C++ als exe + dlls geschrieben, mit Ausnahme der Schnittstelle zum OOXML-Dokument. Die letztere Komponente ist eine COM-Komponente, die in C# /. NET erstellt wurde. Der Hauptgrund dafür ist, dass das .NET-Framework System.IO.Packaging enthält. Dies ist eine sehr praktische integrierte Einrichtung für den Umgang mit OOXML-Dokumenten.
Wir erstellen ein Dokument aus einem Vorlage-OOXML-Dokument, in dem bestimmte Teile durch ihren tatsächlichen Inhalt ersetzt werden.
Eines dieser Bits ist eine OLE-Server-Komponente. Grundsätzlich ist dies ein binäres Segment innerhalb der OOXML-Datei. Zum Schreiben dieses Binärsegments verwendet die Packaging-Komponente anscheinend isolierten Speicher.
Problem
ein Segment> 8MB führt zu einer Ausnahme Schreiben geworfen „Kann nicht die Identität der Domäne bestimmen“.
Auf der C++ Seite enthält diese Ausnahme den Fehler ISS_E_ISOSTORE (0x80131450).
Wir haben dies analysiert und, soweit wir das beurteilen können, ist dies eine Sicherheitsfunktion, die verhindert, dass halb nicht vertrauenswürdige Komponenten von Drittanbietern Ihre HD vollständig ruinieren, indem sie immense Dateien schreiben.
Wir haben dann eine Menge Dinge in der .NET/COM-Komponente ausprobiert (benutzerdefinierte Anwendungsdomänen erstellen, Attribute für maximale Permissivität festlegen, Eigene Streams erstellen und diese an die Packaging-Komponente übergeben), aber jedes Mal ergab es sich Ausnahme wird ausgelöst.
Was können wir tun, damit dies funktioniert?
Könnte es sein, dass, wenn die .NET-Komponente als COM-Komponente instanziiert wird, ihre AppDomain immer nicht vertrauenswürdig ist?
Es ist nicht direkt mit OOXML verwandt, aber es hält uns davon ab, die OOXML zu schreiben, die wir wollen, also in dieser Hinsicht ist es verwandt. Ich habe nie gesagt, dass mein System von einer 8-MB-Datei summiert wurde, die .NET-Laufzeit-Sicherheitsfunktion für isolierte Speicher scheint zu denken, dass dies eine gute Obergrenze ist. – QBziZ