{"record":{"id":"cd59b0972dd7db65","repo":"JosefNemec/Playnite","slug":"extension-version-string-must-be-a-real-version","errorCode":null,"errorMessage":"Extension version string must be a real version!","messagePattern":"Extension version string must be a real version!","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"source/Playnite/Manifests/ExtensionManifest.cs","lineNumber":47,"sourceCode":"\r\n        public string Version { get; set; }\r\n\r\n        public List<Link> Links { get; set; }\r\n\r\n        [YamlIgnore]\r\n        public string DirectoryPath { get; set; }\r\n\r\n        [YamlIgnore]\r\n        public string DirectoryName { get; set; }\r\n\r\n        [YamlIgnore]\r\n        public string DescriptionPath { get; set; }\r\n\r\n        public void VerifyManifest()\r\n        {\r\n            if (!System.Version.TryParse(Version, out var extver))\r\n            {\r\n                throw new Exception(\"Extension version string must be a real version!\");\r\n            }\r\n        }\r\n    }\r\n\r\n    public class ExtensionManifest : BaseExtensionManifest\r\n    {\r\n        [YamlIgnore]\r\n        public bool IsExternalDev { get; set; }\r\n\r\n        //[YamlIgnore]\r\n        //public bool IsCompatible { get; } = false;\r\n\r\n        public string Module { get; set; }\r\n\r\n        public string Icon { get; set; }\r\n\r\n        public ExtensionType Type { get; set; }\r\n\r","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/JosefNemec/Playnite/blob/5911f4e964e628aa7a69c2030ab35101afa63067/source/Playnite/Manifests/ExtensionManifest.cs#L29-L65","documentation":"Thrown by BaseExtensionManifest.VerifyManifest when the Version string fails System.Version.TryParse — i.e. it is not a valid .NET version (such as '1.0' or '1.2.3.4'). Manifest verification requires a parseable version to compare compatibility and perform updates.","triggerScenarios":"VerifyManifest is called on an ExtensionManifest/ThemeManifest whose Version field holds a non-version string (e.g. 'v1', 'latest', '1.0-beta', or empty). Version.TryParse rejects non-numeric/non-standard tokens.","commonSituations":"Extension/theme author typed an arbitrary version tag in the manifest yaml; a pre-release suffix breaks strict Version parsing; manifest hand-edited with an invalid value.","solutions":["Set Version in the manifest to a valid 2-4 component numeric string (e.g. '1.0.0.0').","Remove pre-release suffixes or move them to a separate field if the schema supports it.","Run the manifest through VerifyManifest during packaging to catch the error early."],"exampleFix":"// before\nif (!System.Version.TryParse(Version, out var extver)) { throw new Exception(\"Extension version string must be a real version!\"); }\n\n// after — clearer message with the bad value\nif (!System.Version.TryParse(Version, out var extver)) {\n    throw new FormatException($\"Manifest Version '{Version}' is not a valid version (expect major.minor[.build[.revision]]).\");\n}","handlingStrategy":"validation","validationCode":"// Validate the version string before installing/packaging.\nif (!Version.TryParse(manifest.Version, out _)) {\n    throw new FormatException($\"Invalid manifest version: {manifest.Version}\");\n}","typeGuard":"static bool IsValidManifestVersion(string v) => Version.TryParse(v, out _);","tryCatchPattern":null,"preventionTips":["Use strict numeric semver-like versions in manifests (major.minor.build.revision).","Run VerifyManifest in CI for every extension/theme build.","Avoid pre-release suffixes in the Version field if the schema does not support them."],"tags":["addon","manifest","validation","versioning"],"backgroundTag":null,"analyzedSha":"5911f4e964e628aa7a69c2030ab35101afa63067","analyzedAt":"2026-08-13T17:38:25.713Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}