Skip to content

Commit bee05c8

Browse files
authored
AssemblyNameInfo.FullName should contain PublicKey, fixes #102051 (#105649)
1 parent 39dd2e1 commit bee05c8

File tree

3 files changed

+35
-10
lines changed

3 files changed

+35
-10
lines changed

src/libraries/Common/src/System/Reflection/AssemblyNameFormatter.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace System.Reflection
1010
{
1111
internal static class AssemblyNameFormatter
1212
{
13-
public static string ComputeDisplayName(string name, Version? version, string? cultureName, byte[]? pkt, AssemblyNameFlags flags = 0, AssemblyContentType contentType = 0)
13+
public static string ComputeDisplayName(string name, Version? version, string? cultureName, byte[]? pkt, AssemblyNameFlags flags = 0, AssemblyContentType contentType = 0, byte[]? pk = null)
1414
{
1515
const int PUBLIC_KEY_TOKEN_LEN = 8;
1616
Debug.Assert(name.Length != 0);
@@ -57,19 +57,28 @@ public static string ComputeDisplayName(string name, Version? version, string? c
5757
vsb.AppendQuoted(cultureName);
5858
}
5959

60-
if (pkt != null)
60+
byte[]? keyOrToken = pkt ?? pk;
61+
if (keyOrToken != null)
6162
{
62-
if (pkt.Length > PUBLIC_KEY_TOKEN_LEN)
63-
throw new ArgumentException();
63+
if (pkt != null)
64+
{
65+
if (pkt.Length > PUBLIC_KEY_TOKEN_LEN)
66+
throw new ArgumentException();
67+
68+
vsb.Append(", PublicKeyToken=");
69+
}
70+
else
71+
{
72+
vsb.Append(", PublicKey=");
73+
}
6474

65-
vsb.Append(", PublicKeyToken=");
66-
if (pkt.Length == 0)
75+
if (keyOrToken.Length == 0)
6776
{
6877
vsb.Append("null");
6978
}
7079
else
7180
{
72-
HexConverter.EncodeToUtf16(pkt, vsb.AppendSpan(pkt.Length * 2), HexConverter.Casing.Lower);
81+
HexConverter.EncodeToUtf16(keyOrToken, vsb.AppendSpan(keyOrToken.Length * 2), HexConverter.Casing.Lower);
7382
}
7483
}
7584

src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/AssemblyNameInfo.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,20 @@ public string FullName
108108
{
109109
if (_fullName is null)
110110
{
111-
byte[]? publicKeyToken = ((Flags & AssemblyNameFlags.PublicKey) != 0) ? null :
111+
bool isPublicKey = (Flags & AssemblyNameFlags.PublicKey) != 0;
112+
113+
byte[]? publicKeyOrToken =
112114
#if SYSTEM_PRIVATE_CORELIB
113115
PublicKeyOrToken;
114116
#elif NET8_0_OR_GREATER
115117
!PublicKeyOrToken.IsDefault ? Runtime.InteropServices.ImmutableCollectionsMarshal.AsArray(PublicKeyOrToken) : null;
116118
#else
117119
!PublicKeyOrToken.IsDefault ? PublicKeyOrToken.ToArray() : null;
118120
#endif
119-
_fullName = AssemblyNameFormatter.ComputeDisplayName(Name, Version, CultureName, publicKeyToken,
120-
ExtractAssemblyNameFlags(_flags), ExtractAssemblyContentType(_flags));
121+
_fullName = AssemblyNameFormatter.ComputeDisplayName(Name, Version, CultureName,
122+
pkt: isPublicKey ? null : publicKeyOrToken,
123+
ExtractAssemblyNameFlags(_flags), ExtractAssemblyContentType(_flags),
124+
pk: isPublicKey ? publicKeyOrToken : null);
121125
}
122126

123127
return _fullName;

src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,18 @@ public void WithPublicTokenKey(string fullName)
2121
Roundtrip(assemblyName);
2222
}
2323

24+
[Theory]
25+
[InlineData("System.IO.Pipelines.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001004b86c4cb78549b34bab61a3b1800e23bfeb5b3ec390074041536a7e3cbd97f5f04cf0f857155a8928eaa29ebfd11cfbbad3ba70efea7bda3226c6a8d370a4cd303f714486b6ebc225985a638471e6ef571cc92a4613c00b8fa65d61ccee0cbe5f36330c9a01f4183559f1bef24cc2917c6d913e3a541333a1d05d9bed22b38cb")]
26+
[InlineData("System.IO.Pipelines.Tests, PublicKey=null")]
27+
public void FullNameContainsPublicKey(string withPublicKey)
28+
{
29+
AssemblyNameInfo assemblyNameInfo = AssemblyNameInfo.Parse(withPublicKey.AsSpan());
30+
Assert.Equal(withPublicKey, assemblyNameInfo.FullName);
31+
32+
AssemblyNameInfo roundTrip = AssemblyNameInfo.Parse(assemblyNameInfo.FullName.AsSpan());
33+
Assert.Equal(withPublicKey, roundTrip.FullName);
34+
}
35+
2436
[Fact]
2537
public void NoPublicKeyOrToken()
2638
{

0 commit comments

Comments
 (0)