2009-04-20 106 views
17

我想检查哪个CPU架构是用户正在运行,它是否是 i386或X64或AMD64。我想用C#来做。 我知道我可以尝试WMI或注册表。除了这两个之外还有别的办法吗?我的项目面向.NET 2.0!使用C#识别CPU架构类型

回答

25

你也可以尝试(仅当它没有操纵工程):

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") 
+1

如果没有设置,该怎么办? – 2009-04-20 09:57:07

+0

没有设置去“操纵”的情况下(至少在Vista上,它是默认设置)。我建议它作为替代方式,不一定是最好的方式。 – 2009-04-20 09:57:50

+0

不错的答案。 – 2009-04-20 10:01:51

0

你可能会问用户?

只是开玩笑当然......我想WMI是你会用它的。但也许还有其他方法?

如果你去WMI那么LinqToWmi可能会有用。我试了一次,它似乎很直接=) - >http://www.codeplex.com/linq2wmi

6

Win32_Processor WMI Class将完成这项工作。使用MgmtClassGen.exe来生成强类型的包装。

+2

这可能是该问题的最佳答案。 – 2010-05-22 05:51:28

+0

这帮了我很多!感谢和+1! – 2011-12-21 13:33:07

+0

Win32_Processor类应该如何帮助?如果你在谈论OSArchitecture,那么这个属性在大多数Windows版本中都不可用,只有少数最新版本支持它。 – ivan 2012-03-08 11:36:04

1

也许this CodeProject上的文章可以帮助?它使用System.Management命名空间中的ManagementObjectSearcher来搜索硬件信息。

0

我相信你应该避免像WMI和LINQ那样的严重膨胀,你必须最终获得更多的信息,而这些信息都不会被臃肿的API和框架所满足。

只需调用一个调用并提取CPUID信息的dll即可。 C++/CLI或pinvoke会做,并获得你需要的供应商的所有信息。首先,您需要查看指令是否受支持(99%的时间)。

要快速启动并运行,请检查intel网站上的wincpuid示例,并从那里从cpuid.h中提取该部分。只有2个供应商,一个是内存延迟好,另一个不是(如本地和托管代码)。所以你会遇到Mono在其他架构等问题(谁不btw)。至于64,你已经知道了,或只是让corflags(它的存在已经和杀灭与.NET分配客户的硬盘驱动器)..

http://software.intel.com/en-us/articles/api-detects-ia-32-and-x64-platform-cpu-characteristics/

-3

这里就是我所做的:

public static bool Isx86() 
{ 
    return (Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%").Length == 0); 
} 

如果你在64位体系结构中,你将有两个程序文件环境变量。如果你使用x86,你只能拥有一个。

-1

这似乎是最简单的对我说:

System.Environment.Is64BitOperatingSystem 
16

是什么导致我在这里是检查32和64位操作系统。评分最高的回答是查看当前流程的设置。没有找到答案后,我找到了以下设置。希望这对你有用。

bool is64 = System.Environment.Is64BitOperatingSystem 
9

下面是一段代码,似乎工作(基于P/Invoke的):

public static ProcessorArchitecture GetProcessorArchitecture() 
    { 
     SYSTEM_INFO si = new SYSTEM_INFO(); 
     GetNativeSystemInfo(ref si); 
     switch (si.wProcessorArchitecture) 
     { 
      case PROCESSOR_ARCHITECTURE_AMD64: 
       return ProcessorArchitecture.Amd64; 

      case PROCESSOR_ARCHITECTURE_IA64: 
       return ProcessorArchitecture.IA64; 

      case PROCESSOR_ARCHITECTURE_INTEL: 
       return ProcessorArchitecture.X86; 

      default: 
       return ProcessorArchitecture.None; // that's weird :-) 
     } 
    } 

[DllImport("kernel32.dll")] 
    private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo); 

    private const int PROCESSOR_ARCHITECTURE_AMD64 = 9; 
    private const int PROCESSOR_ARCHITECTURE_IA64 = 6; 
    private const int PROCESSOR_ARCHITECTURE_INTEL = 0; 

    [StructLayout(LayoutKind.Sequential)] 
    private struct SYSTEM_INFO 
    { 
     public short wProcessorArchitecture; 
     public short wReserved; 
     public int dwPageSize; 
     public IntPtr lpMinimumApplicationAddress; 
     public IntPtr lpMaximumApplicationAddress; 
     public IntPtr dwActiveProcessorMask; 
     public int dwNumberOfProcessors; 
     public int dwProcessorType; 
     public int dwAllocationGranularity; 
     public short wProcessorLevel; 
     public short wProcessorRevision; 
    } 

注意此代码重用现有的CLR的ProcessorArchitecture枚举,并支持.NET Framework 2及更高版本。

5

最后解决平台/处理器架构在C#中当前运行的CLR运行时最短的诀窍是:

PortableExecutableKinds peKind; 
ImageFileMachine machine; 
typeof(object).Module.GetPEKind(out peKind, out machine); 

这里Module.GetPEKind返回ImageFileMachine枚举,因为.NET V2它存在:

public enum ImageFileMachine 
{ 
    I386 = 0x014C, 
    IA64 = 0x0200, 
    AMD64 = 0x8664, 
    ARM  = 0x01C4 // new in .NET 4.5 
} 

为什么不使用new AssemblyName(fullName)typeof(object).Assembly.GetName()
那么有在ASP.NET MVC源代码这HACK评论(自1.0):

private static string GetMvcVersionString() { 
    // DevDiv 216459: 
    // This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in 
    // medium trust. However, Assembly.FullName *is* accessible in medium trust. 
    return new AssemblyName(typeof(MvcHttpHandler).Assembly.FullName).Version.ToString(2); 
} 

看看他们使用一些隐藏的技巧为自己。不幸的是,AssemblyName构造函数没有适当地设置ProcessorArchitecture字段,无论新的AssemblyName如何,它只是None

因此,对于未来的读者,让我推荐你用ImageFileMachine使用那个丑陋的GetPEKind!

注:

  • 这将返回当前正在运行的运行架构,而不是基本的系统架构!
    也就是说,唯一的例外是I386运行时可能运行在AMD64系统上。
  • 在mono/ubuntu 14.04/AMD64和.NET/Win7/I386上测试。
0

根据您想知道的原因,您可能会发现检查IntPtr结构的大小是最简单的方法。

2

我知道,这个问题是来自过去,但截至2017年,现在有一个简单的方法来了解当前进程的架构,在.NET标准:

System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture 

返回的值是一个是X86,X64,ARM,ARM64,并给出了它正在运行的进程的体系结构。OSArchitecture代替了返回已安装操作系统的体系结构。

链接的文档(相当无用的,虽然...):

RuntimeInformation.ProcessArchitecture: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.runtimeinformation.processarchitecture?view=netstandard-1.4

架构枚举: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.architecture?view=netstandard-1.4

0

这个怎么样?

switch (typeof(string).Assembly.GetName().ProcessorArchitecture) { 
    case System.Reflection.ProcessorArchitecture.X86: 
     break; 
    case System.Reflection.ProcessorArchitecture.Amd64: 
     break; 
    case System.Reflection.ProcessorArchitecture.Arm: 
     break; 
} 

但是case *.Arm:尚未测试。