{"record":{"id":"35c8d14d9ac2d881","repo":"dotnet/wpf","slug":"sr-streamobjectdisposed-dataspacemanager","errorCode":null,"errorMessage":"SR.StreamObjectDisposed","messagePattern":"SR\\.StreamObjectDisposed","errorType":"exception","errorClass":"ObjectDisposedException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/WindowsBase/System/IO/Packaging/CompoundFile/DataSpaceManager.cs","lineNumber":373,"sourceCode":"                    _baseStream?.Close();\n                }\n            }\n            finally\n            {\n                _baseStream = null;\n                base.Dispose(disposing);\n            }\n        }\n\n        /////////////////////////////\n        // Private Methods\n        /////////////////////////////\n\n        private void CheckDisposed()\n        {\n            if (_baseStream == null)\n            {\n                throw new ObjectDisposedException(null, SR.StreamObjectDisposed);\n            }\n        }\n\n        private bool _dirty;\n        private Stream _baseStream;\n    }\n\n    private struct DataSpaceDefinition\n    {\n        private ArrayList _transformStack;\n        private Byte[]    _extraData;\n\n        internal DataSpaceDefinition(ArrayList transformStack, Byte[] extraData)\n        {\n            _transformStack = transformStack;\n            _extraData = extraData;\n        }\n","sourceCodeStart":355,"sourceCodeEnd":391,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/IO/Packaging/CompoundFile/DataSpaceManager.cs#L355-L391","documentation":"DataSpaceManager's stream (Stream-based wrapper over a compound file data space) throws ObjectDisposedException with message SR.StreamObjectDisposed when used after Dispose. Dispose sets _baseStream to null; CheckDisposed runs at the start of SetLength, Seek, Read, Write, and Flush.","triggerScenarios":"Calling Read/Write/Seek/Flush/SetLength on the data-space stream after its Dispose() was called (explicitly or via using-block exit).","commonSituations":"Holding a reference to a packaging stream after the containing Package/compound file was closed, or a premature using-scope exit followed by cached-stream reuse.","solutions":["Check stream.CanRead/CanWrite (false after dispose) or wrap access in try/catch ObjectDisposedException.","Reopen the stream from the Package/compound file instead of reusing the disposed instance.","Fix object lifetime: keep the owning Package open while the stream is in use; don't cache streams across close."],"exampleFix":"// before\nvar data = stream.Read(buffer, 0, n); // throws if disposed\n// after\nif (!stream.CanRead) stream = package.OpenPartStream(); // reopen before use","handlingStrategy":"try-catch","validationCode":"bool usable = stream != null && stream.CanRead;","typeGuard":"bool IsAlive(Stream s) => s != null && s.CanRead;","tryCatchPattern":"try { stream.Read(buf, 0, n); } catch (ObjectDisposedException) { stream = ReopenStream(); }","preventionTips":["Keep the owning Package open while using its streams","Never cache packaging streams beyond a using scope","Check CanRead/CanWrite before use"],"tags":["wpf","packaging","objectdisposed","stream","compoundfile"],"backgroundTag":"invalid-state-transition","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-22T01:17:13.364Z"}