Skip to content

Commit ac0ef8a

Browse files
Fix icsharpcode#3253: Remove duplicate assembly references keeping the ones with the highest version.
1 parent 684e728 commit ac0ef8a

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,14 +327,39 @@ private async Task InitializeAsync(MetadataFile mainModule, IAssemblyResolver as
327327
typeSystemOptions &= ~TypeSystemOptions.NativeIntegersWithoutAttribute;
328328
}
329329
var mainModuleWithOptions = mainModule.WithOptions(typeSystemOptions);
330-
var referencedAssembliesWithOptions = referencedAssemblies.Select(file => file.WithOptions(typeSystemOptions));
330+
// create IModuleReferences for all references
331+
var referencedAssembliesWithOptions = new List<IModuleReference>(referencedAssemblies.Count);
332+
Dictionary<string, (Version version, int insertionIndex)> referenceAssemblyVersionMap = new();
333+
foreach (var file in referencedAssemblies)
334+
{
335+
// if the file is an assembly, we need to make sure to deduplicate all assemblies,
336+
// with the same name, but different version. We keep the highest version number.
337+
if (file.IsAssembly)
338+
{
339+
var newFileVersion = file.Metadata.GetAssemblyDefinition().Version;
340+
if (referenceAssemblyVersionMap.TryGetValue(file.Name, out var info))
341+
{
342+
if (newFileVersion >= info.version)
343+
{
344+
referencedAssembliesWithOptions[info.insertionIndex] = file.WithOptions(typeSystemOptions);
345+
referenceAssemblyVersionMap[file.Name] = (newFileVersion, info.insertionIndex);
346+
}
347+
continue;
348+
}
349+
else
350+
{
351+
referenceAssemblyVersionMap[file.Name] = (file.Metadata.GetAssemblyDefinition().Version, referencedAssembliesWithOptions.Count);
352+
}
353+
}
354+
referencedAssembliesWithOptions.Add(file.WithOptions(typeSystemOptions));
355+
}
331356
// Primitive types are necessary to avoid assertions in ILReader.
332357
// Other known types are necessary in order for transforms to work (e.g. Task<T> for async transform).
333358
// Figure out which known types are missing from our type system so far:
334359
var missingKnownTypes = KnownTypeReference.AllKnownTypes.Where(IsMissing).ToList();
335360
if (missingKnownTypes.Count > 0)
336361
{
337-
Init(mainModule.WithOptions(typeSystemOptions), referencedAssembliesWithOptions.Concat(new[] { MinimalCorlib.CreateWithTypes(missingKnownTypes) }));
362+
Init(mainModuleWithOptions, referencedAssembliesWithOptions.Concat(new[] { MinimalCorlib.CreateWithTypes(missingKnownTypes) }));
338363
}
339364
else
340365
{

0 commit comments

Comments
 (0)