`

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# 操作系统位数(x32/64)是指在 C# 编程中获取当前操作系统的位数,即是否是 32 位(x32)或 64 位(x64)。在实际开发中,这个信息非常重要,因为不同的操作系统位数可能需要不同的编译方式和优化策略。 在 C# ...

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

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

    C#判断系统是32位还是64位的方法

    本文将详细介绍两种常用的方法来判断操作系统是32位还是64位。 首先,我们可以使用WMI(Windows Management Instrumentation)来获取系统处理器的信息。WMI是一个基于标准的管理基础设施,它提供了访问操作系统和...

    判断是否是64位操作系统

    "判断是否是64位操作系统"这个主题,主要涉及的是如何在编程中检测当前运行的系统是否为64位。 在Windows系统中,我们可以利用API函数来检查系统架构。其中,`IsWow64Process`是Windows API中用于检测当前进程是否...

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

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

    获取注册表指定路径的值或判断是64位还是32位

    本篇将详细讲解如何在VS2015环境下,通过编程获取注册表特定路径的值,并判断操作系统是32位还是64位。 首先,我们要了解的是,VS2015是一个集成开发环境,支持多种编程语言,如C#、C++、VB.NET等。在这里,我们将...

    文件位数3264判断器.zip

    程序需要解析PE(Portable Executable)头,找到数据目录中的IMAGE_FILE_HEADER和OPTIONAL_HEADER结构,查看Machine字段来判断是32位还是64位。 3. **条件判断**:根据解析出的机器类型(如IMAGE_FILE_MACHINE_I386...

    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...

    进程外com组件实现win764位软件调用32位库

    在Windows操作系统中,由于兼容性问题,64位应用程序通常无法直接调用32位动态链接库(DLL)。为了克服这一限制,可以采用进程外COM(Out-of-Process COM)组件来实现跨位数调用。本文将详细介绍如何通过进程外COM...

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

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

    SQLite自动切换32位64位dll

    在实例代码`sqlite.dll 1.0.65.0`中,开发者可能已经实现了一个机制,使得程序在运行时能够自动识别当前系统是32位还是64位,然后加载相应的SQLite DLL。这通常通过.NET Framework的`Environment.Is64BitProcess`和`...

    7z.dll 32位 64位 7z.dll动态链接库

    为了满足不同系统的需求,本压缩包包含了7z-64.dll和7z-32.dll两个文件,分别对应64位和32位操作系统。在部署应用程序时,应根据目标操作系统的位数选择合适的版本,确保程序的正常运行。 总之,7z.dll是C#开发中...

    16位转浮点型float,MODBUS 32位转浮点型float 64位转双浮点型double

    本篇主要介绍16位、32位以及64位数据如何转换为浮点型(float)和双浮点型(double)。 首先,我们要理解二进制、16进制与浮点数的关系。计算机内部存储数字都是以二进制形式,而16进制是人类更易读的一种表示方式...

    c#图书条形码转换,isbn,9位,10位,13位互相转换,封装类,完整代码

    在C#中,我们可以创建一个封装类来处理这些转换。这个类通常包含以下几个方法: 1. **NineToTen**: 这个方法将9位的ISBN转换为10位。9位ISBN的校验位通常是通过特定算法计算得出的,该算法涉及所有其他8位数字的...

    32/64位MySQL dll

    "32/64位MySQL dll"指的是适用于32位和64位操作系统的MySQL动态链接库(DLL)文件。DLL文件是Windows操作系统中的一个重要组成部分,它们包含可由多个程序共享的代码和资源,从而优化内存使用和系统性能。 在C++、...

    Sybase.Data.AseClient.dll (32+64+86位)

    《Sybase.Data.AseClient.dll在C#中的应用与位数匹配详解》 在C#编程环境中,数据库的连接和操作是不可或缺的部分。Sybase数据库系统作为一款强大的企业级数据库,其.NET数据提供者——Sybase.Data.AseClient.dll,...

    24位BMP转32位BMP

    在C#中处理BMP文件时,我们可以利用.NET框架提供的System.Drawing命名空间,其中的Bitmap类提供了对BMP文件的读写和操作功能。转换24位BMP到32位BMP的过程主要包括以下几个步骤: 1. **读取源文件**:首先,我们...

    Oracle.DataAccess 64位/32位 各版本集合

    32位版本适用于32位操作系统或在64位操作系统下运行的32位应用程序,而64位版本则用于64位操作系统下的64位应用程序。在选择使用哪个版本时,需要确保与应用程序的位数匹配,否则可能会导致运行时错误。 安装Oracle...

Global site tag (gtag.js) - Google Analytics