日期:2014-05-19  浏览次数:20823 次

吐血奉献:C#获取硬盘编号、CPU编号及类型、内存大小及使用情况
如果利用C#获取系统有关环境和属性,这个也是在网上问得比较多的问题,不过大部分只有提问没有回答,最近正好想做有关方面的东西,整理了一下,提供给大家,希望能给大家提供参考意见:

首先需要定义几个结构(struct)   ,便于DllImport作为返回参数调用。以下是代码:
CpuInfo.cs

using   System;
using   System.Configuration;
using   System.Runtime.InteropServices;

/**//**
  *   LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
  *   注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
  *   LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
  *   LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
  */
 
/**////   <summary>
///   定义CPU的信息结构
///   </summary>
[StructLayout(LayoutKind.Sequential)]  
public   struct   CpuInfo
...{
        /**////   <summary>
        ///   OEM   ID
        ///   </summary>
        public   uint   dwOemId;
        /**////   <summary>
        ///   页面大小
        ///   </summary>
        public   uint   dwPageSize;
        public   uint   lpMinimumApplicationAddress;
        public   uint   lpMaximumApplicationAddress;
        public   uint   dwActiveProcessorMask;
        /**////   <summary>
        ///   CPU个数
        ///   </summary>
        public   uint   dwNumberOfProcessors;
        /**////   <summary>
        ///   CPU类型
        ///   </summary>
        public   uint   dwProcessorType;
        public   uint   dwAllocationGranularity;
        /**////   <summary>
        ///   CPU等级
        ///   </summary>
        public   uint   dwProcessorLevel;
        public   uint   dwProcessorRevision;  
}
MemoryInfo.cs
using   System;
using   System.Configuration;
using   System.Runtime.InteropServices;

/**//**
  *   LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
  *   注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
  *   LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
  *   LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
  */
/**////   <summary>
///   定义内存的信息结构
///   </summary>
[StructLayout(LayoutKind.Sequential)]
public   struct   MemoryInfo
...{
        /**////   <summary>
        ///  
        ///   </summary>
        public   uint   dwLength;
        /**////   <summary>
        ///   已经使用的内存
        ///   </summary>
        public   uint   dwMemoryLoad;
        /**////   <summary>
        ///   总物理内存大小
        ///   </summary>