`

C#如何判断操作系统位数是32位还是64位

    博客分类:
  • C#
 
阅读更多

方法一:
对于C#来说,调用WMI是一种简单易行的方式。我们可以用Win32_Processor类里面的AddressWidth属性来表示系统的位宽。AddressWidth的值受CPU和操作系统的双重影响。
具体的值如下面的表格所示:

  32bit OS 64bit OS
32bit CPU AddressWidth = 32 N/A
64bit CPU AddressWidth = 32 AddressWidth = 64


可以用下面的C#代码得到AddressWidth的值
(注意需添加引用System.Management)

复制代码
public static string Detect3264()
{
             ConnectionOptions oConn = new ConnectionOptions();
             System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\\\localhost", oConn);
             System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select AddressWidth from Win32_Processor");
             ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);
             ManagementObjectCollection oReturnCollection = oSearcher.Get();
            string addressWidth = null;

            foreach (ManagementObject oReturn in oReturnCollection)
             {
                 addressWidth = oReturn["AddressWidth"].ToString();
             }

            return addressWidth;
}
复制代码

方法二:

     bool type;
     type = Environment.Is64BitOperatingSystem;
     Console.WriteLine(type);

如返回值为True则表示是64位,如返回值为False则表示为32位。

方法三:
这个方法也是最直接的方法,但是有条件限制,例用IntPtr结构的size属性来查看系统的位宽
命名空间是System;
前题是程序需要采用any/CPU的方式进行编辑;
正常情况下int的位宽是4位,即是32位操作系统。

复制代码
if (IntPtr.Size == 8)
{ 
  //64 bit
}
else if (IntPtr.Size == 4)
{ 
  //32 bit
}
else 
{
  //...NotSupport
}
复制代码

方法四:
64位Wnidows 里面有个叫Wow64 的模拟器技术,可以使32位的程序在64位Windows 上运行。 当你想在程序里面针对32b位/ 64位系统执行不同代码的时候, 需要判断操作系统是32位还是64位。 使用 Windows API函数 GetNativeSystemInfo 可以获得这个信息。

复制代码
SYSTEM_INFO si; 
GetNativeSystemInfo(&si); 
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||    
si.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_IA64 ) 
{ 
//64 位操作系统 
} 
else 
{ 
// 32 位操作系统 
}
复制代码

另外,Windows API 还提供了 IsWow64Process 函数判断程序是不是运行在Wow64模拟器之上。

BOOL bIsWow64 = FALSE; 
IsWow64Process(GetCurrentProcess(), &bIsWow64);

需要注意是GetNativeSystemInfo  函数从Windows XP 开始才有, 而 IsWow64Process  函数从 Windows XP with SP2 以及 Windows Server 2003 with SP1 开始才有。 所以使用该函数的时候最好用GetProcAddress。

复制代码
typedef void (WINAPI *LPFN_PGNSI)(LPSYSTEM_INFO); 

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);     

LPFN_PGNSI pGNSI = (LPFN_PGNSI ) GetProcAddress(    
             GetModuleHandle(TEXT("kernel32.dll")),    "GetNativeSystemInfo"); 

LPFN_ISWOW64PROCESS    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( 
             GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); 
复制代码
分享到:
评论

相关推荐

    C# 操作系统位数(x32/64)

    源码 , c#获取系统位数 使用前,首先选中解决方案中的 引用 –>添加引用 -> .net 活页下找到 System.Management;

    c#判断操作系统位数的示例分享

    在.net 4.5中,判断操作系统不用再写方法去判断了,有直接可以利用的属性了哦,如下所示:Environment.Is64BitProcess 属性.NET Framework 4.5 确定当前进程是否为 64 位进程。当然如果是用的.net 4.5以前的童鞋也...

    Sqlite C# AnyCPU X86/X64 32位/64位 自适应 3.8.11.1

    支持项目生成时选择为AnyCPU(不受32位系统与64位系统的限制) 已完善为自动检测当前系统位数,本次程序运行只释放对应位数的SQLite.Interop.dll 在只装有.NET2.0的机器上就可以操作Sqlite数据库。 实测32(XP,2003...

    Sqlite C# AnyCPU X86/X64 32位/64位 自适应

    支持项目生成时选择为AnyCPU(不受32位系统与64位系统的限制) 已完善为自动检测当前系统位数,本次程序运行只释放对应位数的SQLite.Interop.dll 在只装有.NET2.0的机器上就可以操作Sqlite数据库。 实测32(XP,2003...

    Sqlite AnyCPU 不需要C++运行环境 32位 64位 自适应

    支持项目生成时选择为AnyCPU(不受32位系统与64位系统的限制) 已完善为自动检测当前系统位数,本次程序运行只释放对应位数的SQLite.Interop.dll 在只装有.NET2.0的机器上就可以操作Sqlite数据库。 实测32(XP,2003...

    SQLite不需要C++运行环境32位64位自适应

    支持项目生成时选择为AnyCPU(不受32位系统与64位系统的限制) 已完善为自动检测当前系统位数,本次程序运行只释放对应位数的SQLite.Interop.dll 在只装有.NET2.0的机器上就可以操作Sqlite数据库。 实测32(XP,2003...

    System.Data.SQLite(32、64通用版本)

    支持项目生成时选择为AnyCPU(不受32位系统与64位系统的限制) 已完善为自动检测当前系统位数,本次程序运行只释放对应位数的SQLite.Interop.dll 在只装有.NET2.0的机器上就可以操作Sqlite数据库。 实测32(XP,2003...

    C#+asp.net_会员积分系统

    (4)因为使用的是积分系统和销售系统分离的设计,此时需要到会员积分管理中,做一次“积分处理”的操作。系统根据会员卡号和消费金额,自动为会员计算积分并累积。 (5)到了节假日,可进行积分反馈活动。前提是要...

    OS 操作系统 进程 线程 文件 设备 C# 多用户 登陆 课程设计 报告 算法 FCFS

    本系统由用C#语言进行编写和实现,可实现多用户登录。各模块简介如下: 1 文件部分分为C盘和D盘两个磁盘块,在每个磁盘块中均可进行新建、删除、编辑、格式化、显示 属性及个文件等操作。如可新建文件夹、文本...

    关于资源“C# 调用Matlab编译的动态链接库dll”的补充文件和说明

    我看评论说运行不了,可能是因为没装Matlab或者Matlab版本和操作系统位数和我编译的dll不匹配,因此我把Matlab原函数文件补充,可自行在Matlab下运用deploytool命令进行重新编译,然后在C#程序中重新引用。...

    C# 基于数据库的学生管理系统,c#学生管理系统数据库代码,C#

    每个数据表都有“LoginID”为主键约束,防止其他字段重复导致的冲突。其中学生成绩的总分依赖与其他成绩,为其他...因为电话号码为11 位数,该字段数据类型定义为nvarchar(50),其他每个字段的定义类型都为nchar(10)。

    C#编程经验技巧宝典

    115 <br>0192 如何获取“我的文档”系统文件夹路径 115 <br>0193 如何获取应用程序当前执行的路径 116 <br>0194 如何获取当前操作系统的信息 116 <br>0195 如何实现基本数据类型随意转换 116...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例050 设置货币值中使用的小数位数 64 实例051 格式化输入数据为货币格式 65 实例052 开发一个进制转换器 66 3.4 日期时间格式的数据处理 67 实例053 动态获得系统当前日期和时间 67 实例054 手动设置系统日期时间...

    毕设&课设&项目&竞赛-基于C与stm32汇编实现计算学号和并在数码管显示个位数功能.zip

    操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习...

Global site tag (gtag.js) - Google Analytics