{"record":{"id":"126ec6f7721c43bc","repo":"dotnet/wpf","slug":"uri-must-be-absolute-relative-uris-are-not-supported","errorCode":null,"errorMessage":"URI must be absolute. Relative URIs are not supported.","messagePattern":"URI must be absolute\\. Relative URIs are not supported\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/IO/Packaging/PreloadedPackages.cs","lineNumber":154,"sourceCode":"            }\n        }\n\n        // Null the instance.  Similar to Dispose, but not quite.\n        internal static void Clear()\n        {\n            lock (_globalLock)\n            {\n                _packagePairs = null;\n            }\n        }\n\n        private static void ValidateUriKey(Uri uri)\n        {\n            ArgumentNullException.ThrowIfNull(uri);\n\n            if (!uri.IsAbsoluteUri)\n            {\n                throw new ArgumentException(SR.UriMustBeAbsolute, nameof(uri));\n            }\n        }\n\n        #endregion Internal Methods\n\n        /// <summary>\n        /// Package-bool pair where the bool represents the thread-safety status of the package\n        /// </summary>\n        private class PackageThreadSafePair\n        {\n            //------------------------------------------------------\n            //\n            //  Internal Constructors\n            //\n            //------------------------------------------------------\n            internal PackageThreadSafePair(Package package, bool threadSafe)\n            {\n                Invariant.Assert(package != null);","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/IO/Packaging/PreloadedPackages.cs#L136-L172","documentation":"PreloadedPackages keys its package registry by full package Uri; ValidateUriKey rejects null and any relative Uri, throwing ArgumentException (SR.UriMustBeAbsolute) with the 'uri' parameter name. This library throws it because only absolute package URIs can unambiguously identify a package store key.","triggerScenarios":"Calling PreloadedPackages.GetPackage, AddPackage, or RemovePackage with a relative Uri such as new Uri(\"/myPackage.xps\", UriKind.Relative) or a default-initialized Uri.","commonSituations":"Building package URIs from user or config strings that omit the scheme; switching from PackUriHelper-created absolute URIs to hand-built ones; passing pack part URIs that lost their base when resolved.","solutions":["Pass an absolute package URI, e.g. new Uri(\"pack://application:,,,/\", UriKind.Absolute) or PackUriHelper.Create(partUri) results","Resolve relative URIs against a known base: new Uri(baseUri, relativePath)","Check uri.IsAbsoluteUri before calling the API and fail fast with a clearer message"],"exampleFix":"// before\npackages.AddPackage(new Uri(\"/app.xps\", UriKind.Relative), pkg);\n// after\nvar absUri = new Uri(\"pack://application:,,,/app.xps\", UriKind.Absolute);\npackages.AddPackage(System.IO.Packaging.PackUriHelper.GetPackageUri(absUri), pkg);","handlingStrategy":"validation","validationCode":"if (uri == null || !uri.IsAbsoluteUri)\n    throw new ArgumentException(\"Package key must be an absolute URI\", nameof(uri));\npreloadedPackages.AddPackage(uri, package);","typeGuard":"static bool IsAbsolutePackageUri(Uri u) => u != null && u.IsAbsoluteUri;","tryCatchPattern":"try { PreloadedPackages.AddPackage(uri, pkg); } catch (ArgumentException ex) when (ex.ParamName == \"uri\") { uri = new Uri(packBaseUri, uri); PreloadedPackages.AddPackage(uri, pkg); }","preventionTips":["Create package URIs with PackUriHelper.Create or absolute pack:// URIs only","Validate uri.IsAbsoluteUri at configuration load time","Resolve relative config paths against a documented base URI before use"],"tags":["packaging","uri","absolute-uri-required","argument-validation"],"backgroundTag":"invalid-url-format","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"}