.NET 7+如何获取运行中程序集的处理器架构?
在 .NET 7+ 中获取程序集处理器架构的替代方案
在 .NET 7 及以后版本中,AssemblyName.ProcessorArchitecture 已被标记为过时,以下是两种无需指定程序集名称的替代方案:
方案一:读取程序集PE元数据(获取编译时目标架构)
通过 System.Reflection.Metadata 命名空间读取当前执行程序集的PE头信息,可获取程序集编译时指定的目标架构:
using System.Reflection; using System.Reflection.Metadata; using System.Reflection.PortableExecutable; using System.IO; // 获取当前执行程序集的物理路径 string assemblyPath = Assembly.GetExecutingAssembly().Location; using var fileStream = File.OpenRead(assemblyPath); using var peReader = new PEReader(fileStream); if (peReader.HasMetadata) { MetadataReader metadataReader = peReader.GetMetadataReader(); AssemblyDefinition assemblyDef = metadataReader.GetAssemblyDefinition(); // 将MetadataProcessorArchitecture映射为原ProcessorArchitecture枚举值 ProcessorArchitecture targetArch = assemblyDef.Architecture switch { MetadataProcessorArchitecture.Amd64 => ProcessorArchitecture.Amd64, MetadataProcessorArchitecture.X86 => ProcessorArchitecture.X86, MetadataProcessorArchitecture.IA64 => ProcessorArchitecture.IA64, MetadataProcessorArchitecture.Arm => ProcessorArchitecture.Arm, MetadataProcessorArchitecture.Arm64 => ProcessorArchitecture.Arm64, _ => ProcessorArchitecture.MSIL }; // 输出结果,比如MSIL、Amd64等 Console.WriteLine(targetArch); }
方案二:获取当前进程运行架构(适用于多数场景)
如果你的需求是获取程序实际运行时的处理器架构(而非编译时的目标架构),可以直接使用 RuntimeInformation 类,无需读取程序集元数据:
using System.Runtime.InteropServices; Architecture processArch = RuntimeInformation.ProcessArchitecture; // 映射为原ProcessorArchitecture枚举值 ProcessorArchitecture runtimeArch = processArch switch { Architecture.X64 => ProcessorArchitecture.Amd64, Architecture.X86 => ProcessorArchitecture.X86, Architecture.Arm => ProcessorArchitecture.Arm, Architecture.Arm64 => ProcessorArchitecture.Arm64, _ => ProcessorArchitecture.MSIL }; Console.WriteLine(runtimeArch);
两种方案的区别
- 方案一获取的是程序集编译时设定的目标架构(例如AnyCPU编译的程序集会返回
MSIL); - 方案二获取的是当前进程实际运行的架构(例如AnyCPU程序在64位系统上运行会返回
Amd64)。
内容的提问来源于stack exchange,提问作者Soleil
相关产品推荐
相关产品推荐

