From 343d67a88ce5cbe17e1d1b767cc47b478afd169c Mon Sep 17 00:00:00 2001 From: Rob LaDuca Date: Mon, 14 Oct 2019 13:24:41 -0700 Subject: [PATCH] In .NET Core 3.0 System.IO.Compression's ZipArchive does not support multiple ZipArchiveEntries to be open concurrently when using FileAccess.Write. This is a requirement of the XPS serialization stack in WPF. As such, we need to create XPS documents as FileAccess.ReadWrite in order to allow this behavior. --- .../src/ReachFramework/Packaging/XpsDocument.cs | 6 +++++- .../src/ReachFramework/Packaging/XpsManager.cs | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsDocument.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsDocument.cs index 8b19df2ba8f..12fe4b37535 100644 --- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsDocument.cs +++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsDocument.cs @@ -894,9 +894,13 @@ bool testIsSignable Stream dataStream ) { + // In .NET Core 3.0 System.IO.Compression's ZipArchive does not allow creation of ZipArchiveEntries when + // a prior ZipArchiveEntry is still open. XPS Serialization requires this as part of its implementation. + // To get around this, XPS creation should occur in with FileAccess.ReadWrite if the underlying stream + // supports it. This allows multiple ZipArchiveEntries to be open concurrently. Package package = Package.Open(dataStream, FileMode.CreateNew, - FileAccess.Write); + (dataStream.CanRead) ? FileAccess.ReadWrite : FileAccess.Write); XpsDocument document = new XpsDocument(package); document.OpcPackage = package; diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsManager.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsManager.cs index d310c25c322..751d55ba1a0 100644 --- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsManager.cs +++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsManager.cs @@ -139,9 +139,13 @@ CompressionOption compressionOption { if( packageAccess == FileAccess.Write ) { + // In .NET Core 3.0 System.IO.Compression's ZipArchive does not allow creation of ZipArchiveEntries when + // a prior ZipArchiveEntry is still open. XPS Serialization requires this as part of its implementation. + // To get around this, XPS creation should occur in with FileAccess.ReadWrite. This allows multiple + // ZipArchiveEntries to be open concurrently. package = Package.Open(path, FileMode.Create, - packageAccess, + FileAccess.ReadWrite, FileShare.None); streaming = true; }