@@ -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