{"record":{"id":"8908dcea878b677f","repo":"dotnet/wpf","slug":"sr-cannotchangecryptoprovider","errorCode":null,"errorMessage":"SR.CannotChangeCryptoProvider","messagePattern":"SR\\.CannotChangeCryptoProvider","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/CompoundFile/RightsManagementEncryptionTransform.cs","lineNumber":491,"sourceCode":"        #endregion IDataTransform Properties\n        \n        #region RightsManagementEncryptionTransform Properties \n\n        /// <value>\n        /// This property represents the CryptoProvider object that will be used to determine\n        /// what operations the current user is allowed to perform on the encrypted content.\n        /// </value>\n        internal CryptoProvider CryptoProvider\n        {\n            get\n            {\n                return _cryptoProvider;\n            }\n            set\n            {\n                if (_fixedSettings)\n                {\n                    throw new InvalidOperationException(SR.CannotChangeCryptoProvider);\n                }\n\n                ArgumentNullException.ThrowIfNull(value);\n\n                if (!value.CanEncrypt && !value.CanDecrypt)\n                {\n                    throw new ArgumentException(SR.CryptoProviderIsNotReady, nameof(value));\n                }\n\n                _cryptoProvider = value;\n            }\n        }\n\n        /// <value>\n        /// Expose the transform identifier for the use of the DataSpaceManager.\n        /// </value>\n        internal static string ClassTransformIdentifier\n        {","sourceCodeStart":473,"sourceCodeEnd":509,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/CompoundFile/RightsManagementEncryptionTransform.cs#L473-L509","documentation":"The CryptoProvider property setter throws InvalidOperationException with SR.CannotChangeCryptoProvider when _fixedSettings is true. Once the transform's settings are fixed, the crypto provider can no longer be swapped. The provider must be assigned before initialization completes.","triggerScenarios":"Setting transform.CryptoProvider after the transform has been initialized and its settings fixed; reconfiguring a transform that already participated in encryption/decryption.","commonSituations":"Late-binding the crypto provider after package flush; reusing a transform across documents and trying to install a different provider; dependency-injection containers replacing the provider post-initialization.","solutions":["Assign CryptoProvider before initializing/flushing the transform","Create a fresh RightsManagementEncryptionTransform for the new provider","Track transform state and skip provider assignment once fixed","Fix application ordering so provider acquisition (SecureEnvironment.Create...CryptoProvider) precedes transform initialization"],"exampleFix":"// before\ntransform.InitializeRMForCreate(...); // fixes settings\ntransform.CryptoProvider = provider;   // throws\n// after\ntransform.CryptoProvider = provider;\ntransform.InitializeRMForCreate(...);","handlingStrategy":"validation","validationCode":"if (!transform.CanSetCryptoProvider /* or track fixed state yourself */) throw new InvalidOperationException(\"Assign CryptoProvider before initialization fixes settings\");","typeGuard":null,"tryCatchPattern":"try { transform.CryptoProvider = provider; } catch (InvalidOperationException) { transform = new RightsManagementEncryptionTransform(); transform.CryptoProvider = provider; }","preventionTips":["Set CryptoProvider before InitializeRMForCreate/first use","Treat transform configuration as write-once","Centralize transform construction in one factory method to enforce ordering"],"tags":["wpf","rights-management","invalid-operation","crypto"],"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"}