ASP.NET(c#)中取得当前计算机CPU 内存使用率等相关信息

2007年10月18日--ASP.NET(c#)中取得当前计算机CPU 内存使用率等相关信息 2007-10-18 19:48:16 本文已公布到博客频道情感·经历分类

ASP.NET(c#)中取得当前计算机CPU 内存使用率等相关信息

在Visual  C#中调用API的基本过程:               首先,在调用API之前,你必须先导入System.Runtime.InteropServices这个名称空间。该名称空间包含了在Visual  C#中调用API的一些必要集合,具体的方法如下:              using  System.Runtime.InteropServices;              在导入了名称空间后,我们要声明在程序中所要用到的API函数。我们的程序主要是获取系统的相关信息,所以用到的API函数都是返回系统信息的。先给出在Visual C#中声明API的方法:        

Image   [DllImport( " kernel32 " )]     Image       public    static    extern    void   GetWindowsDirectory(StringBuilder  WinDir, int   count);  

         其中,"DllImport"属性用来从不可控代码中调用一个方法,它指定了DLL的位置,该DLL中包含调用的外部方法;"kernel32"设定了类库名;"public"指明函数的访问类型为公有的;"static"修饰符声明一个静态元素,而该元素属于类型本身而不是指定的对象;"extern"表示该方法将在工程外部执行,同时使用DllImport导入的方法必须使用"extern"修饰符;最后GetWindowsDirectory函数包含了两个参数,一个为StringBuilder类型的,另一个为int类型的,该方法返回的内容存在于StringBuilder类型的参数中。同时,因为我们在这里使用到了StringBuilder类,所以在程序的开始处,我们还得添加System.Text这个名称空间,方法同上。              其他几个API函数的声明如下:  

Image [DllImport( " kernel32 " )]     Image             public    static    extern    void   GetSystemDirectory(StringBuilder   Image            SysDir, int   count);   Image            [DllImport( " kernel32 " )]     Image             public    static    extern    void   GetSystemInfo( ref   CPU_INFO  cpuinfo);  Image                Image            [DllImport( " kernel32 " )]     Image             public    static    extern    void   GlobalMemoryStatus( ref   MEMORY_INFO   Image            meminfo);     Image            [DllImport( " kernel32 " )]     Image             public    static    extern    void   GetSystemTime( ref   SYSTEMTIME_INFO   Image            stinfo); 

             以上几个API的作用分别是获取系统路径,获得CPU相关信息,获得内存的相关信息,获得系统时间等。              在声明完所有的API函数后,我们发现后三个函数分别用到了CPU_INFO、MEMORY_INFO、SYSTEMTIME_INFO等结构,这些结构并非是.Net内部的,它们从何而来?其实,我们在用到以上API调用时均需用到以上结构,我们将函数调用获得的信息存放在以上的结构体中,最后返回给程序输出。这些结构体比较复杂,但是如果开发者能够熟练运用,那么整个API世界将尽在开发者的掌握之中。以下就是上述结构体的声明:                            

Image // 定义以下各结构   Image // 定义CPU的信息结构   Image [StructLayout(LayoutKind.Sequential)]     Image public    struct   CPU_INFO     ImageImage Image {     Image            public  uint  dwOemId;     Image            public  uint  dwPageSize;     Image            public  uint  lpMinimumApplicationAddress;     Image            public  uint  lpMaximumApplicationAddress;     Image            public  uint  dwActiveProcessorMask;     Image            public  uint  dwNumberOfProcessors;     Image            public  uint  dwProcessorType;     Image            public  uint  dwAllocationGranularity;     Image            public  uint  dwProcessorLevel;     Image            public  uint  dwProcessorRevision;     Image}    Image Image // 定义内存的信息结构   Image [StructLayout(LayoutKind.Sequential)]     Image public    struct   MEMORY_INFO     ImageImage Image {   Image            public  uint  dwLength;   Image            public  uint  dwMemoryLoad;     Image            public  uint  dwTotalPhys;     Image            public  uint  dwAvailPhys;     Image            public  uint  dwTotalPageFile;     Image            public  uint  dwAvailPageFile;     Image            public  uint  dwTotalVirtual;     Image            public  uint  dwAvailVirtual;     Image}    Image Image // 定义系统时间的信息结构   Image [StructLayout(LayoutKind.Sequential)]     Image public    struct   SYSTEMTIME_INFO     ImageImage Image {     Image            public  ushort  wYear;     Image            public  ushort  wMonth;     Image            public  ushort  wDayOfWeek;     Image            public  ushort  wDay;     Image            public  ushort  wHour;     Image            public  ushort  wMinute;     Image            public  ushort  wSecond;     Image            public  ushort  wMilliseconds;     Image}   

            结构体定义的主体部分和C++中的没多大差别,具体每个结构体内部成员的定义可参考联机帮助中的SDK文档。同时,我们还发现在每个结构体定义的上面都有一句用中括号括起来的说明性文字。这些说明都是有关结构体成员的布局的,共有三种选项,分别说明如下:              LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序。                 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。                 LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序                 LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。              在上面的程序中,为了方便起见我们都用到了第三种方式所有的API函数以及相关的结构体声明完毕后,我们就运用这些API来实现我们的程序功能――获取系统的相关信息。                            界面可按如下方式布置,不过有兴趣的读者自然可以发挥自己的想象,将界面布局做得更好。              简单的界面布置好后,我们添加一个按钮("获取信息"按钮)的消息处理函数如下:              

 private  void  GetInfo_Click(object  sender,  System.EventArgs  e)

 {    

 //调用GetWindowsDirectory和GetSystemDirectory函数分别取得Windows路径和系统路径    

const  int  nChars  =  128;    

            StringBuilder  Buff  =  new  StringBuilder(nChars);  

     GetWindowsDirectory(Buff,nChars);  

  7Image       WindowsDirectory.Text  =  "Windows路径:"+Buff.ToString();  

  8Image            GetSystemDirectory(Buff,nChars);    

9Image            SystemDirectory.Text  =  "系统路径:"+Buff.ToString();  

10Image            //调用GetSystemInfo函数获取CPU的相关信息  

 11Image            CPU_INFO  CpuInfo;  

 12Image            CpuInfo  =  new  CPU_INFO(); 

  13Image            GetSystemInfo(ref  CpuInfo);  

14Image            NumberOfProcessors.Text  =  

15Image                "本计算机中有"+CpuInfo.dwNumberOfProcessors.ToString()+"个CPU";  

16Image            ProcessorType.Text  =  "CPU的类型为"+CpuInfo.dwProcessorType.ToString();  17Image              18Image            ProcessorLevel.Text  =   19Image                "CPU等级为"+CpuInfo.dwProcessorLevel.ToString();   20Image            OemId.Text  =  "CPU的OEM  ID为"+CpuInfo.dwOemId.ToString();   21Image            PageSize.Text  =  "CPU中的页面大小为"+CpuInfo.dwPageSize.ToString();   22Image            //调用GlobalMemoryStatus函数获取内存的相关信息   23Image            MEMORY_INFO  MemInfo;   24Image            MemInfo  =  new  MEMORY_INFO();   25Image            GlobalMemoryStatus(ref  MemInfo);   26Image            MemoryLoad.Text  =  MemInfo.dwMemoryLoad.ToString()+"%的内存正在使用";   27Image            TotalPhys.Text  =  "物理内存共有"+MemInfo.dwTotalPhys.ToString()+"字节";   28Image            AvailPhys.Text  =  "可使用的物理内存有"+MemInfo.dwAvailPhys.ToString()+"字节";   29Image 30Image            TotalPageFile.Text  =   31Image                "交换文件总大小为"+MemInfo.dwTotalPageFile.ToString()+"字节";   32Image            AvailPageFile.Text  =   33Image                "尚可交换文件大小为"+MemInfo.dwAvailPageFile.ToString()+"字节";   34Image            TotalVirtual.Text  =   35Image                "总虚拟内存有"+MemInfo.dwTotalVirtual.ToString()+"字节";   36Image            AvailVirtual.Text  =   37Image                "未用虚拟内存有"+MemInfo.dwAvailVirtual.ToString()+"字节";   38Image            //调用GetSystemTime函数获取系统时间信息   39Image            SYSTEMTIME_INFO  StInfo;   40Image            StInfo  =  new  SYSTEMTIME_INFO();   41Image            GetSystemTime(ref  StInfo);   42Image            Date.Text  =   43Image                StInfo.wYear.ToString()+""+StInfo.wMonth.ToString()+""+StInfo.wDay.ToString()+""44Image              45Image            Time.Text  =   46Image                (StInfo.wHour+8).ToString()+""+StInfo.wMinute.ToString()+""+StInfo.wSecond.ToString()+""47Image              48Image        }  49Image 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值