@@ -115,7 +115,7 @@ public static (Compilation, IAssemblySymbol) CreateCompilationFromAssembly(strin
115
115
: MetadataImportOptions . Public
116
116
) ,
117
117
syntaxTrees : s_assemblyBootstrap ,
118
- references : GetReferenceAssemblies ( assemblyPath )
118
+ references : GetReferenceAssemblies ( assemblyPath , references )
119
119
. Select ( CreateMetadataReference )
120
120
. Concat ( references ?? [ ] )
121
121
. Append ( metadataReference ) ) ;
@@ -164,11 +164,12 @@ private static IEnumerable<MetadataReference> GetDefaultMetadataReferences(strin
164
164
}
165
165
}
166
166
167
- private static IEnumerable < string > GetReferenceAssemblies ( string assemblyPath )
167
+ private static IEnumerable < string > GetReferenceAssemblies ( string assemblyPath , MetadataReference [ ] references )
168
168
{
169
169
using var assembly = new PEFile ( assemblyPath ) ;
170
170
var assemblyResolver = new UniversalAssemblyResolver ( assemblyPath , false , assembly . DetectTargetFrameworkId ( ) ) ;
171
171
var result = new Dictionary < string , string > ( ) ;
172
+ Dictionary < string , string > ? referenceFiles = default ;
172
173
173
174
GetReferenceAssembliesCore ( assembly ) ;
174
175
@@ -179,20 +180,36 @@ void GetReferenceAssembliesCore(PEFile assembly)
179
180
var file = assemblyResolver . FindAssemblyFile ( reference ) ;
180
181
if ( file is null )
181
182
{
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 )
184
184
{
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
+ }
186
195
}
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
+ }
187
203
188
- continue ;
204
+ continue ;
205
+ }
189
206
}
190
207
191
208
Logger . LogVerbose ( $ "Loaded { reference . Name } from { file } ") ;
192
209
193
- using var referenceAssembly = new PEFile ( file ) ;
194
- if ( result . TryAdd ( referenceAssembly . Name , file ) )
210
+ if ( result . TryAdd ( reference . Name , file ) )
195
211
{
212
+ using var referenceAssembly = new PEFile ( file ) ;
196
213
GetReferenceAssembliesCore ( referenceAssembly ) ;
197
214
}
198
215
}
@@ -201,7 +218,7 @@ void GetReferenceAssembliesCore(PEFile assembly)
201
218
return result . Values ;
202
219
}
203
220
204
- private static MetadataReference CreateMetadataReference ( string assemblyPath )
221
+ internal static MetadataReference CreateMetadataReference ( string assemblyPath )
205
222
{
206
223
var documentation = XmlDocumentationProvider . CreateFromFile ( Path . ChangeExtension ( assemblyPath , ".xml" ) ) ;
207
224
return MetadataReference . CreateFromFile ( assemblyPath , documentation : documentation ) ;
0 commit comments