diff --git a/src/Docfx.Dotnet/CompilationHelper.cs b/src/Docfx.Dotnet/CompilationHelper.cs index a8af3d50dd3..69d3463828f 100644 --- a/src/Docfx.Dotnet/CompilationHelper.cs +++ b/src/Docfx.Dotnet/CompilationHelper.cs @@ -115,7 +115,7 @@ public static (Compilation, IAssemblySymbol) CreateCompilationFromAssembly(strin : MetadataImportOptions.Public ), syntaxTrees: s_assemblyBootstrap, - references: GetReferenceAssemblies(assemblyPath) + references: GetReferenceAssemblies(assemblyPath, references) .Select(CreateMetadataReference) .Concat(references ?? []) .Append(metadataReference)); @@ -164,11 +164,12 @@ private static IEnumerable GetDefaultMetadataReferences(strin } } - private static IEnumerable GetReferenceAssemblies(string assemblyPath) + private static IEnumerable GetReferenceAssemblies(string assemblyPath, MetadataReference[] references) { using var assembly = new PEFile(assemblyPath); var assemblyResolver = new UniversalAssemblyResolver(assemblyPath, false, assembly.DetectTargetFrameworkId()); var result = new Dictionary(); + Dictionary? referenceFiles = default; GetReferenceAssembliesCore(assembly); @@ -179,20 +180,36 @@ void GetReferenceAssembliesCore(PEFile assembly) var file = assemblyResolver.FindAssemblyFile(reference); if (file is null) { - // Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459 - if (reference.Version?.ToString() != "0.0.0.0") + if (referenceFiles == null) { - Logger.LogWarning($"Unable to resolve assembly reference {reference}", code: "InvalidAssemblyReference"); + referenceFiles = new(); + foreach (var referenceFile in references.OfType()) + { + var name = Path.GetFileNameWithoutExtension(referenceFile.FilePath); + if (!string.IsNullOrEmpty(name) + && !referenceFiles.TryAdd(name, referenceFile.FilePath!)) + { + Logger.LogWarning($"Duplicate reference files for '{name}'.", code: "InvalidAssemblyReference"); + } + } } + if (!referenceFiles.TryGetValue(reference.Name, out file)) + { + // Skip warning for some weired assembly references: https://github.com/dotnet/docfx/issues/9459 + if (reference.Version?.ToString() != "0.0.0.0") + { + Logger.LogWarning($"Unable to resolve assembly reference {reference}", code: "InvalidAssemblyReference"); + } - continue; + continue; + } } Logger.LogVerbose($"Loaded {reference.Name} from {file}"); - using var referenceAssembly = new PEFile(file); - if (result.TryAdd(referenceAssembly.Name, file)) + if (result.TryAdd(reference.Name, file)) { + using var referenceAssembly = new PEFile(file); GetReferenceAssembliesCore(referenceAssembly); } } @@ -201,7 +218,7 @@ void GetReferenceAssembliesCore(PEFile assembly) return result.Values; } - private static MetadataReference CreateMetadataReference(string assemblyPath) + internal static MetadataReference CreateMetadataReference(string assemblyPath) { var documentation = XmlDocumentationProvider.CreateFromFile(Path.ChangeExtension(assemblyPath, ".xml")); return MetadataReference.CreateFromFile(assemblyPath, documentation: documentation); diff --git a/src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs b/src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs index e94c3a1a01a..63265ae8007 100644 --- a/src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs +++ b/src/Docfx.Dotnet/DotnetApiCatalog.Compile.cs @@ -86,11 +86,7 @@ await LoadCompilationFromProject(project.AbsolutePath) is { } compilation) } var references = config.References ?? []; - var metadataReferences = references.Select(assemblyPath => - { - var documentation = XmlDocumentationProvider.CreateFromFile(Path.ChangeExtension(assemblyPath, ".xml")); - return MetadataReference.CreateFromFile(assemblyPath, documentation: documentation); - }).ToArray(); + var metadataReferences = references.Select(CompilationHelper.CreateMetadataReference).ToArray(); // LoadCompilationFrom C# source files if (files.TryGetValue(FileType.CSSourceCode, out var csFiles))