我正在使用Visual C#2010 express,我需要最可靠的方式(在按钮点击)和.NET 2.0框架中检测窗口当前是否在消息框中是x86或x64 ..到目前为止我一直在使用这段代码,但我需要知道是否有更准确的方法?
string target = @"C:\Windows\SysWow64";
{
if (Directory.Exists(target))
{
MessageBox.Show("x64");
}
else
{
MessageBox.Show("x86");
}
答案 0 :(得分:9)
到目前为止,最简单的测试是检查IntPtr的大小:
if (IntPtr.Size == 8)
{
MessageBox.Show("x64");
}
else
{
MessageBox.Show("x86");
}
假设您使用默认的平台目标设置为“任何CPU”来构建EXE。请注意,此默认值在VS2010中已更改。
答案 1 :(得分:7)
您可以使用PROCESSOR_ARCHITECTURE环境变量...
System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
它将返回以下之一:x86,AMD64,IA64。
您可能只对x86和AMD64值感兴趣,IA64不是很受欢迎,未来微软也不会支持它。它适用于Itanium和Itanium 2处理器。
另一个简单的方法是查看注册表,看看SOFTWARE\Wow6432Node
或HKLM
是否存在HKCU
。
答案 2 :(得分:6)
我认为最好的方法是使用:System.Environment.Is64BitOperatingSystem
。
答案 3 :(得分:4)
这有一段时间了。我相信它与.NET 2.0兼容,但我不完全确定。你可能只对0和9的情况感兴趣(它们是最常见的)。
public static string GetCpuArch()
{
ManagementScope scope = new ManagementScope();
ObjectQuery query = new ObjectQuery("SELECT Architecture FROM Win32_Processor");
ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection results = search.Get();
ManagementObjectCollection.ManagementObjectEnumerator e = results.GetEnumerator();
e.MoveNext();
ushort arch = (ushort)e.Current["Architecture"];
switch (arch)
{
case 0:
return "x86";
case 1:
return "MIPS";
case 2:
return "Alpha";
case 3:
return "PowerPC";
case 6:
return "Itanium";
case 9:
return "x64";
default:
return "Unknown Architecture (WMI ID " + arch.ToString() + ")";
}
}
答案 4 :(得分:2)
PROCESSOR_ARCHITECTURE
环境变量包含正在运行的进程的地址宽度,该地址宽度不一定是操作系统或处理器的地址宽度。快速查看此方法的方法是运行以下命令...
$Env:PROCESSOR_ARCHITECTURE
...在32位和64位PowerShell会话中并比较输出。
因此,如果GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
返回"AMD64"
,那么您肯定拥有64位进程,操作系统和处理器。如果它返回"x86"
,那么你肯定有一个32位进程,但你仍然不知道操作系统和处理器是32位还是64位。
如果你真的在操作系统的地址宽度之后,那么.NET 4提供了Environment.Is64BitOperatingSystem property。您还可以在任何版本的.NET上使用WMI来读取Win32_OperatingSystem class的OSArchitecture
属性:
static string GetOSArchitecture()
{
var query = new WqlObjectQuery("SELECT OSArchitecture FROM Win32_OperatingSystem");
using (var searcher = new ManagementObjectSearcher(query))
using (var results = searcher.Get())
using (var enumerator = results.GetEnumerator())
{
enumerator.MoveNext();
return (string) enumerator.Current.GetPropertyValue("OSArchitecture");
}
}
...但不幸的是,OSArchitecture
属性仅存在于Windows Vista / Server 2008及更高版本上。
对于自2000年以来的所有Windows版本,您可以尝试p /调用GetSystemInfo() function并检查SYSTEM_INFO structure的wProcessorArchitecture
成员。