{"record":{"id":"a7aede776b880189","repo":"dotnet/wpf","slug":"sr-reachpackaging-servicetypealreadyadded","errorCode":null,"errorMessage":"SR.ReachPackaging_ServiceTypeAlreadyAdded","messagePattern":"SR\\.ReachPackaging_ServiceTypeAlreadyAdded","errorType":"exception","errorClass":"XpsPackagingException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsResourcePolicy.cs","lineNumber":91,"sourceCode":"        /// <exception cref=\"ArgumentNullException\">service or serviceType is null..</exception>\n        /// <exception cref=\"XpsPackagingException\">serviceType has already been registered..</exception>\n        public\n        void\n        RegisterService(\n            object      service,\n            Type        serviceType\n            )\n        {\n            ArgumentNullException.ThrowIfNull(serviceType);\n            ArgumentNullException.ThrowIfNull(service);\n\n            if (!_objDict.ContainsKey(serviceType))\n            {\n                _objDict.Add(serviceType, service);\n            }\n            else if (_objDict[serviceType] != service)\n            {\n                throw new XpsPackagingException(SR.Format(SR.ReachPackaging_ServiceTypeAlreadyAdded, serviceType));\n            }\n        }\n        \n        internal\n        bool\n        SubsetComplete(INode node)\n        {\n            FontSubsetterCommitPolicies signal = FontSubsetterCommitPolicies.CommitPerPage;\n            bool validSubsetNode = true;\n            bool subsetComplete = false;\n            if( node is IXpsFixedDocumentSequenceWriter )\n            {\n                signal  = FontSubsetterCommitPolicies.CommitEntireSequence;\n            }\n            else\n            if( node is IXpsFixedDocumentWriter )\n            {\n                signal  = FontSubsetterCommitPolicies.CommitPerDocument;","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/ReachFramework/Packaging/XpsResourcePolicy.cs#L73-L109","documentation":"XpsResourcePolicy.RegisterService stores one service instance per service type in an internal dictionary. If the service type is already registered with a DIFFERENT instance, it throws XpsPackagingException(SR.ReachPackaging_ServiceTypeAlreadyAdded); re-registering the same instance is silently allowed.","triggerScenarios":"Calling RegisterService twice for the same serviceType with two different service objects — e.g. registering a custom service on an XpsSerializationManager/XpsOMSerializationManager that already registered its own service of that type, or double-initialization in serialization pipeline setup.","commonSituations":"Custom printing/serialization pipelines adding a service both globally and per-manager; re-running serialization setup without clearing state; two components each registering their own implementation of the same service interface.","solutions":["Check whether the service type is already registered before calling RegisterService, and only add if absent.","Unregister/remove the existing service (or create a fresh XpsSerializationManager) before registering the new instance.","Reuse the same service instance if you must register again, since identical instances are accepted."],"exampleFix":"// before\nmanager.RegisterService(typeof(MyService), serviceA);\nmanager.RegisterService(typeof(MyService), serviceB); // throws\n// after\nmanager.RegisterService(typeof(MyService), serviceA);\n// or remove/replace first, then register serviceB","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":"catch (XpsPackagingException) { /* service type already registered with a different instance: reuse or unregister first */ }","preventionTips":["Register services once during initialization only.","Reuse a singleton service instance to make re-registration idempotent.","Guard registration with an existence check."],"tags":["xps","serialization","service-registration","duplicate","wpf"],"backgroundTag":"conflicting-config-options","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"}