diff --git a/src/libraries/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj b/src/libraries/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
index 73a99e80c14fed..ae0cd121a97b6c 100644
--- a/src/libraries/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
+++ b/src/libraries/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
@@ -9,6 +9,8 @@
The System.Reflection.Metadata library is built-in as part of the shared framework in .NET Runtime. The package can be installed when you need to use it in other target frameworks.
README.md
+ 1
+ true
diff --git a/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/MetadataReader.netstandard.cs b/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/MetadataReader.netstandard.cs
index 49406b39dec156..37c4c197a68e9a 100644
--- a/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/MetadataReader.netstandard.cs
+++ b/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/MetadataReader.netstandard.cs
@@ -85,6 +85,12 @@ public static unsafe AssemblyName GetAssemblyName(string assemblyFile)
peReader = new PEReader((byte*)safeBuffer.DangerousGetHandle(), (int)safeBuffer.ByteLength);
MetadataReader mdReader = peReader.GetMetadataReader(MetadataReaderOptions.None);
AssemblyName assemblyName = mdReader.GetAssemblyDefinition().GetAssemblyName();
+
+ AssemblyFlags aFlags = mdReader.AssemblyTable.GetFlags();
+#pragma warning disable SYSLIB0037 // AssemblyName.ProcessorArchitecture is obsolete
+ assemblyName.ProcessorArchitecture = CalculateProcArch(peReader, aFlags);
+#pragma warning restore SYSLIB0037
+
return assemblyName;
}
finally
@@ -101,6 +107,42 @@ public static unsafe AssemblyName GetAssemblyName(string assemblyFile)
}
}
+ private static ProcessorArchitecture CalculateProcArch(PEReader peReader, AssemblyFlags aFlags)
+ {
+ // 0x70 specifies "reference assembly".
+ // For these, CLR wants to return None as arch so they can be always loaded, regardless of process type.
+ if (((uint)aFlags & 0xF0) == 0x70)
+ return ProcessorArchitecture.None;
+
+ PEHeaders peHeaders = peReader.PEHeaders;
+ switch (peHeaders.CoffHeader.Machine)
+ {
+ case Machine.IA64:
+ return ProcessorArchitecture.IA64;
+ case Machine.Arm:
+ return ProcessorArchitecture.Arm;
+ case Machine.Amd64:
+ return ProcessorArchitecture.Amd64;
+ case Machine.I386:
+ {
+ CorFlags flags = peHeaders.CorHeader!.Flags;
+ if ((flags & CorFlags.ILOnly) != 0 &&
+ (flags & CorFlags.Requires32Bit) == 0)
+ {
+ // platform neutral.
+ return ProcessorArchitecture.MSIL;
+ }
+
+ // requires x86
+ return ProcessorArchitecture.X86;
+ }
+ }
+
+ // ProcessorArchitecture is a legacy API and does not cover other Machine kinds.
+ // For example ARM64 is not expressible
+ return ProcessorArchitecture.None;
+ }
+
private static AssemblyNameFlags GetAssemblyNameFlags(AssemblyFlags flags)
{
AssemblyNameFlags assemblyNameFlags = AssemblyNameFlags.None;
diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/MetadataReaderTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/MetadataReaderTests.cs
index dad27d509ac645..3b946e5a807795 100644
--- a/src/libraries/System.Reflection.Metadata/tests/Metadata/MetadataReaderTests.cs
+++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/MetadataReaderTests.cs
@@ -3090,8 +3090,13 @@ public void GetAssemblyName()
if (PlatformDetection.HasAssemblyFiles)
{
- Assembly a = typeof(MetadataReaderTests).Assembly;
- Assert.Equal(new AssemblyName(a.FullName).ToString(), MetadataReader.GetAssemblyName(AssemblyPathHelper.GetAssemblyLocation(a)).ToString());
+ Assembly a = typeof(MetadataReader).Assembly;
+ AssemblyName name = MetadataReader.GetAssemblyName(AssemblyPathHelper.GetAssemblyLocation(a));
+ Assert.Equal(new AssemblyName(a.FullName).ToString(), name.ToString());
+
+#pragma warning disable SYSLIB0037 // AssemblyName.ProcessorArchitecture is obsolete
+ Assert.Equal(ProcessorArchitecture.MSIL, name.ProcessorArchitecture);
+#pragma warning restore SYSLIB0037
}
}
}