@@ -115,7 +115,7 @@ public static (Compilation, IAssemblySymbol) CreateCompilationFromAssembly(strin
115115 : MetadataImportOptions . Public
116116 ) ,
117117 syntaxTrees : s_assemblyBootstrap ,
118- references : GetReferenceAssemblies ( assemblyPath )
118+ references : GetReferenceAssemblies ( assemblyPath , references )
119119 . Select ( CreateMetadataReference )
120120 . Concat ( references ?? [ ] )
121121 . Append ( metadataReference ) ) ;
@@ -164,11 +164,12 @@ private static IEnumerable<MetadataReference> GetDefaultMetadataReferences(strin
164164 }
165165 }
166166
167- private static IEnumerable < string > GetReferenceAssemblies ( string assemblyPath )
167+ private static IEnumerable < string > GetReferenceAssemblies ( string assemblyPath , MetadataReference [ ] references )
168168 {
169169 using var assembly = new PEFile ( assemblyPath ) ;
170170 var assemblyResolver = new UniversalAssemblyResolver ( assemblyPath , false , assembly . DetectTargetFrameworkId ( ) ) ;
171171 var result = new Dictionary < string , string > ( ) ;
172+ Dictionary < string , string > ? referenceFiles = default ;
172173
173174 GetReferenceAssembliesCore ( assembly ) ;
174175
@@ -179,20 +180,36 @@ void GetReferenceAssembliesCore(PEFile assembly)
179180 var file = assemblyResolver . FindAssemblyFile ( reference ) ;
180181 if ( file is null )
181182 {
182- // Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459
183- if ( reference . Version ? . ToString ( ) != "0.0.0.0" )
183+ if ( referenceFiles == null )
184184 {
185- Logger . LogWarning ( $ "Unable to resolve assembly reference { reference } ", code : "InvalidAssemblyReference" ) ;
185+ referenceFiles = new ( ) ;
186+ foreach ( var referenceFile in references . OfType < PortableExecutableReference > ( ) )
187+ {
188+ var name = Path . GetFileNameWithoutExtension ( referenceFile . FilePath ) ;
189+ if ( ! string . IsNullOrEmpty ( name )
190+ && ! referenceFiles . TryAdd ( name , referenceFile . FilePath ! ) )
191+ {
192+ Logger . LogWarning ( $ "Duplicate reference files for '{ name } '.", code : "InvalidAssemblyReference" ) ;
193+ }
194+ }
186195 }
196+ if ( ! referenceFiles . TryGetValue ( reference . Name , out file ) )
197+ {
198+ // Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459
199+ if ( reference . Version ? . ToString ( ) != "0.0.0.0" )
200+ {
201+ Logger . LogWarning ( $ "Unable to resolve assembly reference { reference } ", code : "InvalidAssemblyReference" ) ;
202+ }
187203
188- continue ;
204+ continue ;
205+ }
189206 }
190207
191208 Logger . LogVerbose ( $ "Loaded { reference . Name } from { file } ") ;
192209
193- using var referenceAssembly = new PEFile ( file ) ;
194- if ( result . TryAdd ( referenceAssembly . Name , file ) )
210+ if ( result . TryAdd ( reference . Name , file ) )
195211 {
212+ using var referenceAssembly = new PEFile ( file ) ;
196213 GetReferenceAssembliesCore ( referenceAssembly ) ;
197214 }
198215 }
@@ -201,7 +218,7 @@ void GetReferenceAssembliesCore(PEFile assembly)
201218 return result . Values ;
202219 }
203220
204- private static MetadataReference CreateMetadataReference ( string assemblyPath )
221+ internal static MetadataReference CreateMetadataReference ( string assemblyPath )
205222 {
206223 var documentation = XmlDocumentationProvider . CreateFromFile ( Path . ChangeExtension ( assemblyPath , ".xml" ) ) ;
207224 return MetadataReference . CreateFromFile ( assemblyPath , documentation : documentation ) ;
0 commit comments