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 } } }