判断系统架构

调用WMI

  可以用Win32_Processor类里面的AddressWidth属性来表示系统的位宽,但AddressWidth的值受CPU和操作系统的双重影响。

  具体的值如下面的表格所示:

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

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

 1 public string Detect3264()
 2 {
 3     ManagementScope Ms = new ManagementScope("\\\\localhost", new ConnectionOptions());
 4     ObjectQuery Query = new ObjectQuery("select AddressWidth from Win32_Processor");
 5     ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Ms, Query);
 6     ManagementObjectCollection ReturnCollection = Searcher.Get();
 7     string addressWidth = null;
 8     foreach (ManagementObject Return in ReturnCollection)
 9     {
10         addressWidth = Return["AddressWidth"].ToString();
11     }
12     return addressWidth;
13 }

调用Environment

1 bool Is64Bit = Environment.Is64BitOperatingSystem;

  为true则表示是64位,如返回值为false则表示为32位。

利用IntPtr结构获取系统位宽

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

1 switch (IntPtr.Size)
2 {
3     case 4:break;   //32Bit
4     case 8:break;   //64Bit
5     default:break;  //Other
6 }

  或者

1 switch (Marshal.SizeOf(IntPtr.Zero))
2 {
3     case 4:break;   //32Bit
4     case 8:break;   //64Bit
5     default:break;  //Other
6 }

使用API

  64位Wnidows 里面有个叫Wow64 的模拟器技术,可以使32位的程序在64位Windows 上运行。 当你想在程序里面针对32b位/ 64位系统执行不同代码的时候, 需要判断操作系统是32位还是64位。 使用 Windows API函数 GetNativeSystemInfo 可以获得这个信息。(注意是GetNativeSystemInfo  函数从Windows XP 开始才有, 而 IsWow64Process  函数从 Windows XP with SP2 以及 Windows Server 2003 with SP1 开始才有。 )

  所以为了程序不出错,最好用GetSystemInfo或者两个API看情况调用(代码使用两个API,分类使用)

 1 public enum Platform
 2 {
 3     X86,
 4     X64,
 5     IA64,
 6     Unknown
 7 }
 8
 9 const ushort PROCESSOR_ARCHITECTURE_INTEL = 0;
10 const ushort PROCESSOR_ARCHITECTURE_IA64 = 6;
11 const ushort PROCESSOR_ARCHITECTURE_AMD64 = 9;
12 const ushort PROCESSOR_ARCHITECTURE_UNKNOWN = 0xFFFF;
13
14 [StructLayout(LayoutKind.Sequential)]
15 internal struct SYSTEM_INFO
16 {
17     public ushort wProcessorArchitecture;
18     public ushort wReserved;
19     public uint dwPageSize;
20     public IntPtr lpMinimumApplicationAddress;
21     public IntPtr lpMaximumApplicationAddress;
22     public UIntPtr dwActiveProcessorMask;
23     public uint dwNumberOfProcessors;
24     public uint dwProcessorType;
25     public uint dwAllocationGranularity;
26     public ushort wProcessorLevel;
27     public ushort wProcessorRevision;
28 };
29
30 [DllImport("kernel32.dll")]
31 static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo);
32
33 [DllImport("kernel32.dll")]
34 static extern void GetSystemInfo(ref SYSTEM_INFO lpSystemInfo);
35
36 public Platform GetPlatform()
37 {
38     SYSTEM_INFO sysInfo = new SYSTEM_INFO();
39
40     if(System.Environment.OSVersion.Version.Major > 5 ||
41        (System.Environment.OSVersion.Version.Major == 5 && System.Environment.OSVersion.Version.Minor >= 1))
42     {
43         GetNativeSystemInfo(ref sysInfo);
44     }
45     else
46     {
47         GetSystemInfo(ref sysInfo);
48     }
49
50     switch(sysInfo.wProcessorArchitecture)
51     {
52         case PROCESSOR_ARCHITECTURE_IA64:
53             return Platform.IA64;
54
55         case PROCESSOR_ARCHITECTURE_AMD64:
56             return Platform.X64;
57
58         case PROCESSOR_ARCHITECTURE_INTEL:
59             return Platform.X86;
60
61         default:
62             return Platform.Unknown;
63     }
64 }

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

 1 [DllImport("kernel32.dll")]
 2 static extern IntPtr GetCurrentProcess();
 3
 4 [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
 5 [return: MarshalAs(UnmanagedType.Bool)]
 6 static extern bool IsWow64Process(
 7     [In] IntPtr processHandle,
 8     [Out, MarshalAs(UnmanagedType.Bool)] out bool wow64Process);
 9
10 isWow64 = false;
11 if ((System.Environment.OSVersion.Version.Major == 5 && System.Environment.OSVersion.Version.Minor >= 1) ||
12     System.Environment.OSVersion.Version.Major > 5)
13 {
14     SafeProcessHandle processHandle = GetProcessHandle((uint)System.Diagnostics.Process.GetCurrentProcess().Id);
15     //或者 SafeProcessHandle processHandle = GetProcessHandle(GetCurrentProcess());
16     if (!NativeMethods.IsWow64Process(processHandle, out isWow64))
17     {
18         throw new Win32Exception(Marshal.GetLastWin32Error());
19     }
20 }

  还有GetProcAddress,在这里就不赘述了。

时间: 2024-11-05 23:31:44

判断系统架构的相关文章

秒杀系统架构分析与实战

0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一般是定时上架:(5)时间短.瞬时并发量高: 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有: 对现有网站业务造成冲击 秒杀活动只是网站营销的一个附加活动,

秒杀系统架构分析与实战(参考、转载)

目录[-] 0 系列目录 1 秒杀业务分析 2 秒杀技术挑战 3 秒杀架构原则 4 秒杀架构设计 4.1 前端层设计 4.2 站点层设计 4.3 服务层设计 4.4 数据库设计 4.4.1 基本概念 4.4.2 设计思路 5 大并发带来的挑战 5.1 请求接口的合理设计 5.2 高并发的挑战:一定要“快” 5.3 重启与过载保护 6 作弊的手段:进攻与防守 6.1 同一个账号,一次性发出多个请求 6.2 多个账号,一次性发送多个请求 6.3 多个账号,不同IP发送不同请求 7 高并发下的数据安全

saas系统架构经验总结

2B Saas系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统.很多Saas创业公司也拿了大额风投.毕竟Saas相对传统软件的优势非常明显. 最近一年,有幸架构一个Crm saas 系统,上线了几个月来,各方面都比满意.整个系统创建过程,踩了很多坑,收获也比较多.总结一下Saas系统架构一些特点: 1.分层设计 saas系统分层大概是: 租户识别>应用层>数据访问层>缓存层>数据库 业务代码都是写在应用层. 租户识别可以用s

深入理解Tomcat系列之一:系统架构

前言 Tomcat是Apache基金组织下的开源项目,性质是一个Web服务器.下面这种情况很普遍:在eclipse床架一个web项目并部署到Tomcat中,启动tomcat,在浏览器中输入一个类似http://localhost:8080/webproject/anyname.jsp的url,然后就可以看到我们写好的jsp页面的内容了.一切都是那么自然和顺理成章,然而这一切都是源于tomcat带给我们的,那么在tomcat背后,这一切又是怎么样发生的呢?带着对tomcat工作原理的好奇心,我决定

Tomcat 系统架构与设计模式,第 1 部分: 工作原理

Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的多级容器是如何协调工作的角度来分析 Tomcat 的工作原理,这也是一个 Web 服务器首要解决的关键问题. 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tom

电商系统架构——系统鸟瞰图

在看到图(一)这样的图,我们是否有一种探究系统的冲动?这样一个花花绿绿的界面,背后隐藏着什么样的奥秘!用户输入某个域名的时候,比如www.taobao.com的时候,页面是如何展示的,用户在搜索框搜宝贝的时候,系统又是如何处理的,用户在参加秒杀活动的时候,系统又是如何处理的.经过两年多的互联网从业经验,以及自己的思考,在这里我就抛砖引玉对电商系统架构进行探究,探究系统是如何设计的,以及设计这个系统的各种权衡. 图(一) 隐藏在花花绿绿的界面之后,是一个庞大复杂的系统,图(二)是这个系统的鸟瞰图.

【转载】秒杀系统架构分析与实战

本文转载自:http://my.oschina.net/xianggao/blog/524943 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一般是定时上架:(5)时间短.瞬时并发量高: 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是100

HBase系统架构及数据结构(转)

原文链接:Hbase系统架构及数据结构 HBase中的表一般有这样的特点: 1 大:一个表可以有上亿行,上百万列 2 面向列:面向列(族)的存储和权限控制,列(族)独立检索. 3 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏. 下面一幅图是Hbase在Hadoop Ecosystem中的位置. 二.逻辑视图 HBase以表的形式存储数据.表有行和列组成.列划分为若干个列族(row family) Row Key 与nosql数据库们一样,row key是用来检索记

大型网站系统架构分析

千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性? 首先讨论一下大型网站需要注意和考虑的问题. 数据库海量数据处理:负载量不大的情况下select.delete和update是响应很迅速的,最多加几个索引就可以搞定,但千万级的注册用户和一个设计不好的多对多关系将带来非常严重的性能问题.另外在高UPDATE的情况下,更新一个聚焦索引的时间基本上是不可忍受的.索引和更新是一对天生的冤家. 高并发死锁:平时我们感觉不到,但数据库死锁在高并发的