{"record":{"id":"2bc976f5ae0e68c9","repo":"dotnet/wpf","slug":"sr-parserassemblyloadversionmismatch","errorCode":null,"errorMessage":"SR.ParserAssemblyLoadVersionMismatch","messagePattern":"SR\\.ParserAssemblyLoadVersionMismatch","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/Shared/System/Windows/Markup/ReflectionHelper.cs","lineNumber":425,"sourceCode":"        private static Assembly LoadAssemblyHelper(string assemblyGivenName, string assemblyPath)\n        {\n            AssemblyName assemblyName = new AssemblyName(assemblyGivenName);\n            string assemblyShortName = assemblyName.Name;\n            assemblyShortName = assemblyShortName.ToUpper(CultureInfo.InvariantCulture);\n\n            // Check if the assembly has already been loaded.\n            Assembly retassem = (Assembly)_loadedAssembliesHash[assemblyShortName];\n\n            if (retassem is not null)\n            {\n                if (assemblyName.Version is not null)\n                {\n                    AssemblyName cachedName = new AssemblyName(retassem.FullName);\n                    if (!AssemblyName.ReferenceMatchesDefinition(assemblyName, cachedName))\n                    {\n                        string request = assemblyName.ToString();\n                        string found = cachedName.ToString();\n                        throw new InvalidOperationException(SR.Format(SR.ParserAssemblyLoadVersionMismatch, request, found));\n                    }\n                }\n            }\n            else\n            {\n                // Check if the current AppDomain has this assembly loaded for some other reason.\n                // If so, then just use that assembly and don't attempt to load another copy of it.\n                // Only do this if no path is provided.\n                if (string.IsNullOrEmpty(assemblyPath))\n                    retassem = SafeSecurityHelper.GetLoadedAssembly(assemblyName);\n\n                if (retassem is null)\n                {\n                    if (!string.IsNullOrEmpty(assemblyPath))\n                    {\n                        // assemblyPath is set, Load the assembly from this specified place.\n                        // the path must be full file path which contains directory, file name and extension.\n                        Debug.Assert(!assemblyPath.EndsWith(string.Empty + Path.DirectorySeparatorChar, StringComparison.Ordinal), \"the assembly path should be a full file path containing file extension\");","sourceCodeStart":407,"sourceCodeEnd":443,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/Shared/System/Windows/Markup/ReflectionHelper.cs#L407-L443","documentation":"LoadAssemblyHelper caches loaded assemblies by short name. When an assembly matching the short name is already cached but its full identity (version/public key) does not satisfy the requested AssemblyName (AssemblyName.ReferenceMatchesDefinition returns false), it throws InvalidOperationException('SR.ParserAssemblyLoadVersionMismatch') showing both the requested and found identity strings. This prevents silently binding a XAML-referenced assembly to a different version than the one the markup expects.","triggerScenarios":"Calling ReflectionHelper.LoadAssembly(assemblyName, assemblyPath) (used by WPF XAML parsing, e.g. LoadBamlAssembly/PresentationOptions) where an assembly with the same short name is already in _loadedAssembliesHash but with a different version than requested in the assemblyName string, ReflectionHelper.cs:416-427.","commonSituations":"Referencing 'MyAssembly, Version=2.0.0.0' in markup/XmlnsDefinition while version 1.0.0.0 is already loaded in the AppDomain; NuGet or project reference version bumps causing stale GAC/cached copies; mixing debug and release builds of the same assembly name.","solutions":["Align the requested assembly version with the one actually loaded: update your references/markup to the cached assembly's version.","Call ReflectionHelper.ResetCacheForAssembly(assemblyName) so the stale cache entry is cleared and the correct version can be loaded.","Unify assembly versions across projects (binding redirect or consistent package versions) so only one version exists.","Remove the conflicting older copy from the GAC/probing path, or load the correct version before XAML parsing begins."],"exampleFix":"// before\nvar asm = ReflectionHelper.LoadAssembly(\"MyLib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null\", null); // cached copy is 1.0.0.0\n\n// after\nReflectionHelper.ResetCacheForAssembly(\"MyLib\");\nvar asm = ReflectionHelper.LoadAssembly(\"MyLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\", null);","handlingStrategy":"try-catch","validationCode":"// Check for an already-loaded conflicting version before calling LoadAssembly\nvar requested = new AssemblyName(\"MyLib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null\");\nvar alreadyLoaded = AppDomain.CurrentDomain.GetAssemblies()\n    .FirstOrDefault(a => a.GetName().Name == requested.Name);\nif (alreadyLoaded is not null &&\n    !AssemblyName.ReferenceMatchesDefinition(requested, alreadyLoaded.GetName()))\n    throw new InvalidOperationException(\n        $\"Version conflict: requested {requested}, loaded {alreadyLoaded.GetName()}\");","typeGuard":"static bool VersionsMatch(AssemblyName request, Assembly loaded) =>\n    AssemblyName.ReferenceMatchesDefinition(request, loaded.GetName());","tryCatchPattern":"try\n{\n    var asm = ReflectionHelper.LoadAssembly(assemblyName, assemblyPath);\n}\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"version\"))\n{\n    ReflectionHelper.ResetCacheForAssembly(shortName); // clear stale entry and retry once\n    var asm = ReflectionHelper.LoadAssembly(assemblyName, assemblyPath);\n}","preventionTips":["Keep one consistent version of each assembly across all referenced projects and markup.","Call ResetCacheForAssembly when re-loading an assembly after a version change in the same AppDomain.","Avoid hard-coding version-qualified assembly names in XAML/registration unless necessary.","Check AppDomain.CurrentDomain.GetAssemblies() for short-name conflicts before loading."],"tags":["wpf","assembly-loading","version-mismatch","xaml"],"backgroundTag":"assembly-version-mismatch","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"}