diff --git a/src/EditorFeatures/Core/Implementation/MetadataAsSource/MetadataAsSourceFileService.cs b/src/EditorFeatures/Core/Implementation/MetadataAsSource/MetadataAsSourceFileService.cs index 5134703a4a8ab555c1372e3792b0d92c67c57a92..9103d6705ee7021345030fb4850cc0a229289021 100644 --- a/src/EditorFeatures/Core/Implementation/MetadataAsSource/MetadataAsSourceFileService.cs +++ b/src/EditorFeatures/Core/Implementation/MetadataAsSource/MetadataAsSourceFileService.cs @@ -220,15 +220,25 @@ public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters p { foreach (var assembly in parentCompilation.GetReferencedAssemblySymbols()) { - if (assembly.Identity.Name == name.Name - && assembly.Identity.Version == name.Version - && assembly.Identity.PublicKeyToken.SequenceEqual(name.PublicKeyToken ?? Array.Empty())) + if (assembly.Identity.Name != name.Name + || !assembly.Identity.PublicKeyToken.SequenceEqual(name.PublicKeyToken ?? Array.Empty())) { - // reference assemblies should be fine here... - var reference = parentCompilation.GetMetadataReference(assembly); - return AssemblyDefinition.ReadAssembly(reference.Display); + continue; } + + if (assembly.Identity.Version != name.Version + && !string.Equals("mscorlib", assembly.Identity.Name, StringComparison.OrdinalIgnoreCase)) + { + // MSBuild treats mscorlib special for the purpose of assembly resolution/unification, where all + // versions of the assembly are considered equal. The same policy is adopted here. + continue; + } + + // reference assemblies should be fine here... + var reference = parentCompilation.GetMetadataReference(assembly); + return AssemblyDefinition.ReadAssembly(reference.Display); } + // not found return null; }