{"record":{"id":"6f4e993790c5b5c5","repo":"dotnet/wpf","slug":"sr-serializerprovideralreadyregistered","errorCode":null,"errorMessage":"SR.SerializerProviderAlreadyRegistered","messagePattern":"SR\\.SerializerProviderAlreadyRegistered","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"warning","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/Serialization/SerializerProvider.cs","lineNumber":79,"sourceCode":"\n        #endregion\n\n        #region Public Methods\n\n        /// <summary>\n        /// Registers the serializer plug-in identified by serializerDescriptor in the registry\n        /// </summary>\n        public static void RegisterSerializer(SerializerDescriptor serializerDescriptor, bool overwrite)\n        {\n\n            ArgumentNullException.ThrowIfNull(serializerDescriptor);\n\n            RegistryKey plugIns = _rootKey.CreateSubKey(_registryPath);\n            string serializerKey = $\"{serializerDescriptor.DisplayName}/{serializerDescriptor.AssemblyName}/{serializerDescriptor.AssemblyVersion}/{serializerDescriptor.WinFXVersion}\";\n\n            if (!overwrite && plugIns.OpenSubKey(serializerKey) != null)\n            {\n                throw new ArgumentException(SR.SerializerProviderAlreadyRegistered, serializerKey);\n            }\n\n            RegistryKey newPlugIn = plugIns.CreateSubKey(serializerKey);\n            serializerDescriptor.WriteToRegistryKey(newPlugIn);\n            newPlugIn.Close();\n        }\n\n        /// <summary>\n        /// Un-Registers the serializer plug-in identified by serializerDescriptor in the registry\n        /// </summary>\n        /// <remarks>\n        ///     Removes a previously installed plug-n serialiazer from the registry\n        ///\n        ///     This method currently requires full trust to run.\n        /// </remarks>\n        public static void UnregisterSerializer(SerializerDescriptor serializerDescriptor)\n        {\n","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/Serialization/SerializerProvider.cs#L61-L97","documentation":"SerializerProvider.RegisterSerializer writes the serializer descriptor to the plugins registry key named '{DisplayName}/{AssemblyName}/{AssemblyVersion}/{WinFXVersion}'. When overwrite is false and that key already exists, it throws ArgumentException (SR.SerializerProviderAlreadyRegistered) with the serializer key as the paramName. This prevents duplicate registrations of the same serializer identity.","triggerScenarios":"Calling SerializerProvider.RegisterSerializer twice for the same descriptor without overwrite=true; an installer running a second time; two serializers sharing identical DisplayName/AssemblyName/AssemblyVersion/WinFXVersion.","commonSituations":"Re-running a plugin installer; upgrading an assembly without bumping AssemblyVersion while re-registering; application startup code that unconditionally registers a built-in serializer each launch.","solutions":["Call RegisterSerializer with overwrite:true to replace the existing registration","Unregister the serializer (UnregisterSerializer) before re-registering, or ignore the duplicate case","Track registration in app state so it runs once; bump AssemblyVersion for genuinely new serializer versions","Catch ArgumentException from RegisterSerializer and treat 'already registered' as success"],"exampleFix":"// before\nSerializerProvider.RegisterSerializer(descriptor); // throws on re-run\n// after\ntry { SerializerProvider.RegisterSerializer(descriptor); }\ncatch (ArgumentException) { /* already registered - safe to ignore */ }\n// or: SerializerProvider.RegisterSerializer(descriptor, overwrite: true);","handlingStrategy":"try-catch","validationCode":"using Microsoft.Win32;\nbool IsRegistered(RegistryKey root, string pluginsPath, SerializerDescriptor d) {\n    using var plugins = root.OpenSubKey(pluginsPath);\n    var key = $\"{d.DisplayName}/{d.AssemblyName}/{d.AssemblyVersion}/{d.WinFXVersion}\";\n    using var k = plugins?.OpenSubKey(key);\n    return k != null;\n}","typeGuard":null,"tryCatchPattern":"try { SerializerProvider.RegisterSerializer(descriptor); }\ncatch (ArgumentException) { /* already registered - treat as success or re-register with overwrite:true */ }","preventionTips":["Make registration idempotent: check before registering or use overwrite:true","Register once at install time, not on every app launch","Bump AssemblyVersion when shipping new serializer versions"],"tags":["wpf","serializer","registry","duplicate-registration"],"backgroundTag":"file-already-exists","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"}