C# 是否可以从CPU确定操作系统位?
我正在开发的应用程序应该能够运行2个脚本中的1个,这取决于运行该应用程序的操作系统是x64还是x86 四处搜索,我发现了这条线索: 但显然,我的老板担心,最重要的答案可能不会适用于我们用户将运行的所有操作系统(XP/Vista/7)。他推荐了以下代码示例:C# 是否可以从CPU确定操作系统位?,c#,.net-3.5,C#,.net 3.5,我正在开发的应用程序应该能够运行2个脚本中的1个,这取决于运行该应用程序的操作系统是x64还是x86 四处搜索,我发现了这条线索: 但显然,我的老板担心,最重要的答案可能不会适用于我们用户将运行的所有操作系统(XP/Vista/7)。他推荐了以下代码示例: private void GetCpuDetails(out string cpuType) { cpuType = "..."; try { usi
private void GetCpuDetails(out string cpuType)
{
cpuType = "...";
try
{
using (RegistryKey regKey = Registry.LocalMachine)
{
using (RegistryKey subRegKey = regKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"))
{
if (subRegKey.GetValue("ProcessorNameString") != null)
{
cpuType = subRegKey.GetValue("ProcessorNameString").ToString();
}
subRegKey.Close();
}
regKey.Close();
}
}
catch
{
cpuType = "...";
}
}
但是我不明白你怎么可能从CPU上确定操作系统的版本。这似乎与使用处理器体系结构的难题完全相同,因为它将基于CPU而不是操作系统获得64或32位。不,不可能仅从CPU确定这一点。64位CPU设计用于运行32位操作系统,因此了解您拥有的CPU类型不足以了解您拥有的操作系统类型 这一点尤其正确,因为过去几年制造的几乎所有CPU都是64位的,而且这种方式已经持续了足够长的时间,现在发现32位PC仍在使用已经开始变得不寻常(而且越来越不寻常)。然而,许多PC厂商仍然预装32位Windows。我不会惊讶地发现,对于一个纯粹随机的PC样本,检查CPU类型以了解操作系统目前更可能给出错误的答案,而不是正确的答案 我见过的检测操作系统类型的最佳方法是,在这个堆栈溢出问题中,适用于C#,您已经看到了:
对于.Net 4.0之前的.Net,这是正确的方法。对于4.0及更高版本,您当然可以按照注释中所述进行检查。否,仅从CPU无法确定这一点。64位CPU设计用于运行32位操作系统,因此了解您拥有的CPU类型不足以了解您拥有的操作系统类型 这一点尤其正确,因为过去几年制造的几乎所有CPU都是64位的,而且这种方式已经持续了足够长的时间,现在发现32位PC仍在使用已经开始变得不寻常(而且越来越不寻常)。然而,许多PC厂商仍然预装32位Windows。我不会惊讶地发现,对于一个纯粹随机的PC样本,检查CPU类型以了解操作系统目前更可能给出错误的答案,而不是正确的答案 我见过的检测操作系统类型的最佳方法是,在这个堆栈溢出问题中,适用于C#,您已经看到了:
对于.Net 4.0之前的.Net,这是正确的方法。对于4.0及更高版本,您当然可以按照注释中所述进行检查。为什么不检查IntPtr.Size来确定您的应用程序是在x64还是x86模式下运行 如果你在WoW64上,它会误导你,但也许这在你的场景中是好的 澄清: 例如,看看安东尼金在 是否键入interop=(IntPtr.Size==8)?typeof(Foo64):typeof(Foo32) 或者在May的回复中: (IntPtr.Size==4)?“x86”:“x64”
我已经多次使用这种方法。为什么不检查IntPtr.Size来确定应用程序是在x64还是x86模式下运行 如果你在WoW64上,它会误导你,但也许这在你的场景中是好的 澄清: 例如,看看安东尼金在 是否键入interop=(IntPtr.Size==8)?typeof(Foo64):typeof(Foo32) 或者在May的回复中: (IntPtr.Size==4)?“x86”:“x64”
我已经多次使用过这种方法。我认为您可以使用
System.Environment.is64位OperatingSystem
属性,如果操作系统是64位otheriwise false,它将返回true。@Sudhakar是.NET 4.0中新增的,在.NET 3.5中不存在:抱歉,我没有看到框架标记。谢谢你的观点。>“我们的用户将运行(XP/Vista/7)
”。你还在支持XP吗?您是否知道,它在不到6个月的时间内就将停止使用,然后Microsoft将停止所有支持,包括对关键安全问题的支持?现在是时候离开XP了。@JoelCoehoorn相信我,我对它也不感到兴奋。但是,当你在一家拥有超过10万名员工的大公司工作时,并不是每个人都能拥有最新和最好的硬件或软件。见鬼,我的老板自己还在使用XP。我想你可以使用System.Environment.is64位OperatingSystem
属性。如果操作系统是64位的,它将返回true,否则返回false。@Sudhakar这是.NET 4.0中新增的,在.NET 3.5中不存在:抱歉,我没有看到框架标记。谢谢你的观点。>“我们的用户将运行(XP/Vista/7)
”。你还在支持XP吗?您是否知道,它在不到6个月的时间内就将停止使用,然后Microsoft将停止所有支持,包括对关键安全问题的支持?现在是时候离开XP了。@JoelCoehoorn相信我,我对它也不感到兴奋。但是,当你在一家拥有超过10万名员工的大公司工作时,并不是每个人都能拥有最新和最好的硬件或软件。见鬼,我的老板自己还在使用XP。不幸的是,由于我们使用的是第三方库,我被迫将构建目标设置为x86,因此IntPtr.Size为4,而不管它实际运行在哪个平台上。如果它可以是任何平台,我相信这会起作用,尽管我的老板似乎对此也有问题……不幸的是,由于我们使用的第三方库,我被迫将构建目标设置为x86,因此IntPtr.Size为4,而不管它实际运行在哪个平台上。如果它可以是任何平台,我相信这会起作用,尽管我的老板似乎对此也有问题。。。