Skip to content

Commit fe2261e

Browse files
committed
check for target framework to warn unresolved assemblies
1 parent 603c94e commit fe2261e

File tree

4 files changed

+44
-21
lines changed

4 files changed

+44
-21
lines changed

src/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi/PackageDependencyAssemblyResolver.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ internal sealed class PackageDependencyAssemblyResolver {
3636
return reader.Read(stream);
3737
}
3838

39-
private readonly DependencyContext? dependencyContext;
39+
public DependencyContext? DependencyContext { get; }
4040
private readonly ILogger? logger;
4141

4242
public PackageDependencyAssemblyResolver(string componentAssemblyPath, ILogger? logger = null)
4343
{
44-
this.dependencyContext = LoadDependencyContextIfDepsJsonExist(componentAssemblyPath, logger);
44+
this.DependencyContext = LoadDependencyContextIfDepsJsonExist(componentAssemblyPath, logger);
4545
this.logger = logger;
4646
}
4747

@@ -51,12 +51,12 @@ public PackageDependencyAssemblyResolver(string componentAssemblyPath, ILogger?
5151
{
5252
logger?.LogTrace("attempting to resolve package dependency assembly '{AssemblyName}'", name);
5353

54-
if (dependencyContext is null) {
54+
if (DependencyContext is null) {
5555
logger?.LogDebug("could not resolve package dependency '{AssemblyName}'", name);
5656
return null;
5757
}
5858

59-
var runtimeLibrary = dependencyContext
59+
var runtimeLibrary = DependencyContext
6060
.RuntimeLibraries
6161
.FirstOrDefault(
6262
runtimeLib => runtimeLib.Name.Equals(name.Name, StringComparison.OrdinalIgnoreCase)

src/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi/PathAssemblyDependencyResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public PathAssemblyDependencyResolver(string componentAssemblyPath, ILogger? log
4747
assm = packageDependencyResolver.Resolve(assemblyName, context.LoadFromAssemblyPath);
4848

4949
if (assm is null)
50-
RuntimeAssemblyName.WarnNotToBeAbleToResolve(logger, assemblyName);
50+
RuntimeAssemblyName.WarnNotToBeAbleToResolve(logger, assemblyName, packageDependencyResolver.DependencyContext);
5151

5252
return assm;
5353
}

src/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi/RuntimeAssemblyName.cs

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,31 @@
88
#endif
99
using System.Reflection;
1010

11+
using Microsoft.Extensions.DependencyModel;
1112
using Microsoft.Extensions.Logging;
1213

1314
namespace Smdn.Reflection.ReverseGenerating.ListApi;
1415

1516
internal static class RuntimeAssemblyName {
16-
public static void WarnNotToBeAbleToResolve(ILogger? logger, AssemblyName name)
17+
public static void WarnNotToBeAbleToResolve(ILogger? logger, AssemblyName name, DependencyContext? depContext)
1718
{
18-
if (ShouldWarnIfNotToBeAbleToResolve(name))
19+
if (ShouldWarnIfNotToBeAbleToResolve(name, depContext))
1920
logger?.LogWarning("could not resolve assembly '{AssemblyName}'", name);
2021
else
2122
logger?.LogDebug("could not resolve assembly '{AssemblyName}'", name);
2223
}
2324

24-
private static bool ShouldWarnIfNotToBeAbleToResolve(AssemblyName name)
25+
private static bool ShouldWarnIfNotToBeAbleToResolve(AssemblyName name, DependencyContext? depContext)
2526
{
2627
const bool shouldNotWarn = false;
2728
const bool shouldWarn = true;
2829

2930
if (name.Name is null)
3031
return shouldWarn;
3132

33+
if (depContext is null)
34+
return shouldNotWarn; // target framework may be .NET Framework
35+
3236
var publicKeyTokenBytes = name.GetPublicKeyToken();
3337
var publicKeyTokenString = publicKeyTokenBytes is null
3438
? null
@@ -41,28 +45,47 @@ private static bool ShouldWarnIfNotToBeAbleToResolve(AssemblyName name)
4145
// ref: https://github.com/dotnet/source-build-reference-packages/blob/main/src/referencePackageSourceGenerator/Tasks/GenerateProjects.cs
4246
const string PublicKeyTokenMicrosoft = "b03f5f7f11d50a3a";
4347
const string PublicKeyTokenDotnetOpenSource = "cc7b13ffcd2ddd51";
48+
#if false
4449
const string PublicKeyTokenEcma = "b77a5c561934e089";
50+
#endif
4551

46-
if (string.Equals(name.Name, "mscorlib", StringComparison.Ordinal)) {
47-
if (string.Equals(publicKeyTokenString, PublicKeyTokenEcma, StringComparison.OrdinalIgnoreCase))
48-
return shouldNotWarn;
49-
}
50-
51-
if (string.Equals(name.Name, "netstandard", StringComparison.Ordinal)) {
52-
if (string.Equals(publicKeyTokenString, PublicKeyTokenDotnetOpenSource, StringComparison.OrdinalIgnoreCase))
53-
return shouldNotWarn;
54-
}
52+
var isTargetNetStandard = depContext.Target.Framework.StartsWith(".NETStandard,", StringComparison.Ordinal);
5553

56-
if (string.Equals(name.Name, "System", StringComparison.Ordinal) || name.Name.StartsWith("System.", StringComparison.Ordinal)) {
54+
if (isTargetNetStandard) {
5755
if (
58-
string.Equals(publicKeyTokenString, PublicKeyTokenMicrosoft, StringComparison.OrdinalIgnoreCase) ||
59-
string.Equals(publicKeyTokenString, PublicKeyTokenEcma, StringComparison.OrdinalIgnoreCase) ||
56+
string.Equals(name.Name, "netstandard", StringComparison.Ordinal) &&
6057
string.Equals(publicKeyTokenString, PublicKeyTokenDotnetOpenSource, StringComparison.OrdinalIgnoreCase)
6158
) {
6259
return shouldNotWarn;
6360
}
6461
}
6562

63+
var isNameStartsWithOrEqualToSystem =
64+
string.Equals(name.Name, "System", StringComparison.Ordinal) ||
65+
name.Name.StartsWith("System.", StringComparison.Ordinal);
66+
67+
if (isNameStartsWithOrEqualToSystem) {
68+
var isTargetNetCore = depContext.Target.Framework.StartsWith(".NETCoreApp,", StringComparison.Ordinal);
69+
70+
if (isTargetNetCore) {
71+
if (
72+
string.Equals(publicKeyTokenString, PublicKeyTokenDotnetOpenSource, StringComparison.OrdinalIgnoreCase) ||
73+
string.Equals(publicKeyTokenString, PublicKeyTokenMicrosoft, StringComparison.OrdinalIgnoreCase)
74+
) {
75+
return shouldNotWarn;
76+
}
77+
}
78+
79+
if (isTargetNetStandard) {
80+
if (
81+
string.Equals(publicKeyTokenString, PublicKeyTokenDotnetOpenSource, StringComparison.OrdinalIgnoreCase) ||
82+
string.Equals(publicKeyTokenString, PublicKeyTokenMicrosoft, StringComparison.OrdinalIgnoreCase)
83+
) {
84+
return shouldNotWarn;
85+
}
86+
}
87+
}
88+
6689
return shouldWarn;
6790
}
6891
}

src/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi/UnloadableAssemblyLoadContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public UnloadableAssemblyLoadContext(string componentAssemblyPath, ILogger? logg
4040
var assm = packageDependencyResolver.Resolve(name, this.LoadFromAssemblyPath);
4141

4242
if (assm is null)
43-
RuntimeAssemblyName.WarnNotToBeAbleToResolve(logger, name);
43+
RuntimeAssemblyName.WarnNotToBeAbleToResolve(logger, name, packageDependencyResolver.DependencyContext);
4444

4545
return assm;
4646
}

0 commit comments

Comments
 (0)