C#通过WinAPI获取内存信息,32位64位可用
2013-07-09 16:49
453 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleGetSysMemory
{
class Program
{
[StructLayout(LayoutKind.Sequential)]
public struct MEMORYSTATUSEX
{
public uint dwLength;
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys; //可用物理内存
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
}
[DllImport("kernel32.dll")]
public static extern void GlobalMemoryStatusEx(ref MEMORYSTATUSEX stat);
static void Main(string[] args)
{
string msg = "物理内存总数:{1}Mb{0}可用物理内存:{2}Mb{0}虚拟内存总数:{3}Mb{0}可用虚拟内存:{4}Mb";
MEMORYSTATUSEX memInfo = new MEMORYSTATUSEX();
memInfo.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
GlobalMemoryStatusEx(ref memInfo);
Console.WriteLine(string.Format(msg,
Environment.NewLine,
memInfo.ullTotalPhys / 1024 / 1024,
memInfo.ullAvailPhys / 1024 / 1024,
memInfo.ullTotalVirtual / 1024 / 1024,
memInfo.ullAvailVirtual / 1024 / 1024));
Console.ReadKey();
}
}
}
也可以用另一个API GlobalMemoryStatus获取上述信息,但该方法参数长度在32位和64位系统下不同,如定义错误拿不到正确值,如下:
32位系统
[StructLayout(LayoutKind.Sequential)]
public struct MemoryStatus
{
public uint Length;
public uint MemoryLoad;
public uint TotalPhysical;
public uint AvailablePhysical;//可用物理内存
public uint TotalPageFile;
public uint AvailablePageFile;
public uint TotalVirtual;
public uint AvailableVirtual;
}
MemoryStatus memStatus = new MemoryStatus();
memStatus.Length = (uint)Marshal.SizeOf(typeof(MemoryStatus));
GlobalMemoryStatus(ref memStatus);
Console.WriteLine(string.Format(msg,
Environment.NewLine,
memStatus.TotalPhysical / 1024 / 1024,
memStatus.AvailablePhysical / 1024 / 1024,
memStatus.TotalVirtual / 1024 / 1024,
memStatus.AvailableVirtual / 1024 / 1024));
64位系统
[StructLayout(LayoutKind.Sequential)]
public struct MemoryStatus
{
public uint Length;
public uint MemoryLoad;
public ulong TotalPhysical;
public ulong AvailablePhysical;//可用物理内存
public ulong TotalPageFile;
public ulong AvailablePageFile;
public ulong TotalVirtual;
public ulong AvailableVirtual;
}
MemoryStatus memStatus = new MemoryStatus();
memStatus.Length = (uint)Marshal.SizeOf(typeof(MemoryStatus));
GlobalMemoryStatus(ref memStatus);
Console.WriteLine(string.Format(msg,
Environment.NewLine,
(long)memStatus.TotalPhysical / 1024 / 1024,
(long)memStatus.AvailablePhysical / 1024 / 1024,
(long)memStatus.TotalVirtual / 1024 / 1024,
(long)memStatus.AvailableVirtual / 1024 / 1024));
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleGetSysMemory
{
class Program
{
[StructLayout(LayoutKind.Sequential)]
public struct MEMORYSTATUSEX
{
public uint dwLength;
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys; //可用物理内存
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
}
[DllImport("kernel32.dll")]
public static extern void GlobalMemoryStatusEx(ref MEMORYSTATUSEX stat);
static void Main(string[] args)
{
string msg = "物理内存总数:{1}Mb{0}可用物理内存:{2}Mb{0}虚拟内存总数:{3}Mb{0}可用虚拟内存:{4}Mb";
MEMORYSTATUSEX memInfo = new MEMORYSTATUSEX();
memInfo.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
GlobalMemoryStatusEx(ref memInfo);
Console.WriteLine(string.Format(msg,
Environment.NewLine,
memInfo.ullTotalPhys / 1024 / 1024,
memInfo.ullAvailPhys / 1024 / 1024,
memInfo.ullTotalVirtual / 1024 / 1024,
memInfo.ullAvailVirtual / 1024 / 1024));
Console.ReadKey();
}
}
}
也可以用另一个API GlobalMemoryStatus获取上述信息,但该方法参数长度在32位和64位系统下不同,如定义错误拿不到正确值,如下:
32位系统
[StructLayout(LayoutKind.Sequential)]
public struct MemoryStatus
{
public uint Length;
public uint MemoryLoad;
public uint TotalPhysical;
public uint AvailablePhysical;//可用物理内存
public uint TotalPageFile;
public uint AvailablePageFile;
public uint TotalVirtual;
public uint AvailableVirtual;
}
MemoryStatus memStatus = new MemoryStatus();
memStatus.Length = (uint)Marshal.SizeOf(typeof(MemoryStatus));
GlobalMemoryStatus(ref memStatus);
Console.WriteLine(string.Format(msg,
Environment.NewLine,
memStatus.TotalPhysical / 1024 / 1024,
memStatus.AvailablePhysical / 1024 / 1024,
memStatus.TotalVirtual / 1024 / 1024,
memStatus.AvailableVirtual / 1024 / 1024));
64位系统
[StructLayout(LayoutKind.Sequential)]
public struct MemoryStatus
{
public uint Length;
public uint MemoryLoad;
public ulong TotalPhysical;
public ulong AvailablePhysical;//可用物理内存
public ulong TotalPageFile;
public ulong AvailablePageFile;
public ulong TotalVirtual;
public ulong AvailableVirtual;
}
MemoryStatus memStatus = new MemoryStatus();
memStatus.Length = (uint)Marshal.SizeOf(typeof(MemoryStatus));
GlobalMemoryStatus(ref memStatus);
Console.WriteLine(string.Format(msg,
Environment.NewLine,
(long)memStatus.TotalPhysical / 1024 / 1024,
(long)memStatus.AvailablePhysical / 1024 / 1024,
(long)memStatus.TotalVirtual / 1024 / 1024,
(long)memStatus.AvailableVirtual / 1024 / 1024));
相关文章推荐
- c#中利用WMI对象获取物理内存和可用内存大小信息
- c#中利用WMI对象获取物理内存和可用内存大小信息
- C#中通过WMI的Win32_MemoryDevice对象获取内存信息简介
- C#获取32位或者64位系统安装软件信息
- C/C++通过WMI和系统API函数获取获取系统硬件(cpu,内存,显卡,网卡)配置信息
- C# 获取计算机cpu,硬盘,内存相关的信息
- c# 获取电脑硬件信息通用查询类[测试通过]
- SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
- C# 通过分析netstat -an所得信息 查看本机所监听的端口 及判断某端口是否可用
- C#获取操作系统是32位或64位的代码
- Android 获取手机总内存和可用内存等信息
- Android 获取手机总内存和可用内存等信息
- Android 获取手机总内存和可用内存等信息
- C#通过API获取接收数据窗体控件句柄,并向该句柄发送文本信息
- c#获取系统内存等信息
- C#获取内存信息
- C#通过WMI获取硬件信息
- C#获取CPU占用率、内存占用、磁盘占用、进程信息
- c# 获取电脑硬件信息通用查询类[测试通过]
- (证实可用)C#获取AD所有的用户信息,比如登录名,邮件名,属于组织,名字