{"record":{"id":"7e2e5afb1caf717f","repo":"dotnet/wpf","slug":"encryptedpackageenvelope-object-was-disposed","errorCode":null,"errorMessage":"EncryptedPackageEnvelope object was disposed.","messagePattern":"EncryptedPackageEnvelope object was disposed\\.","errorType":"exception","errorClass":"ObjectDisposedException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/WindowsBase/System/IO/Packaging/EncryptedPackage.cs","lineNumber":1064,"sourceCode":"            {\n                //\n                // By setting _disposed = true, we ensure that all future accesses to\n                // this object will fail (because all public methods and property accessors\n                // call CheckDisposed). Note that we do -not- wrap the entire body of\n                // Dispose(bool) (this method) in an \"if (!_disposed)\". This is safe\n                // because we set each reference to null immediately after attempting\n                // to release it, so we never attempt to release any reference more\n                // than once.\n                //\n                _disposed = true;         \n            }\n        }\n\n        private void\n        CheckDisposed()\n        {\n            if (_disposed)\n                throw new ObjectDisposedException(null, SR.EncryptedPackageEnvelopeDisposed);\n        }\n\n        /// <summary>\n        /// Create a stream in the \"encrypted\" data space to hold the package\n        /// contents, and copy the package into that stream.\n        /// </summary>\n        /// <param name=\"packageStream\">\n        /// A stream containing an unencrypted package which is to be stored in\n        /// the compound file.\n        /// </param>\n        private void\n        EmbedPackage(Stream packageStream)\n        {\n            StreamInfo siPackage = new StreamInfo(_root, PackageStreamName);\n\n            Debug.Assert(!siPackage.InternalExists());\n\n            //","sourceCodeStart":1046,"sourceCodeEnd":1082,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/IO/Packaging/EncryptedPackage.cs#L1046-L1082","documentation":"CheckDisposed guards every public accessor of EncryptedPackageEnvelope (Flush, RightsManagementInformation, PackageProperties, FileOpenAccess, GetPackage, StorageInfo). After Dispose, any of these members throws ObjectDisposedException because the underlying compound file has been released.","triggerScenarios":"Using an EncryptedPackageEnvelope after calling Dispose (explicitly or via using-block exit), e.g. reading PackageProperties after the using scope ends, or caching the envelope and using it after disposal.","commonSituations":"Returning the envelope from a method whose using block closed it; storing the envelope in a field while disposing it in another code path; double-dispose followed by further use.","solutions":["Keep all envelope usage inside the scope where it is not disposed; move using blocks outward to cover all accesses","Reopen the envelope (EncryptedPackageEnvelope.Open) if you need access after disposal","Check _disposed-equivalent via a wrapper: track disposal in your own code and avoid calling members afterwards"],"exampleFix":"// before\nEncryptedPackageEnvelope env;\nusing (env = EncryptedPackageEnvelope.Open(path)) { }\nvar props = env.PackageProperties; // ObjectDisposedException\n// after\nusing (var env = EncryptedPackageEnvelope.Open(path))\n{\n    var props = env.PackageProperties; // access inside scope\n}","handlingStrategy":"type-guard","validationCode":"// track disposal in a wrapper\nbool _disposed;\nvoid UseEnvelope(EncryptedPackageEnvelope env) { if (_disposed) throw new ObjectDisposedException(nameof(env)); }","typeGuard":"bool IsUsable(EncryptedPackageEnvelope env, Func<object> probe) { try { probe(); return true; } catch (ObjectDisposedException) { return false; } }","tryCatchPattern":"try { var props = env.PackageProperties; }\ncatch (ObjectDisposedException) { env = EncryptedPackageEnvelope.Open(path); /* reopen */ }","preventionTips":["Scope all envelope usage inside the using block","Never cache the envelope beyond its disposal scope","Reopen the envelope rather than reusing a disposed instance"],"tags":["wpf","packaging","object-disposed","lifetime"],"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-21T21:30:21.729Z"}