我正在尝试查询运行我的应用程序的计算机上的RAM。我尝试了许多获取此信息的不同方法,并得到了一些奇怪的结果。下面您将看到我尝试过的不同方法,并在MessageBox.Show
调用上方对结果进行了评论。
第三个是返回KB,我注意到这是安装内存和前两个获得物理内存的方法。这是正确的,并考虑到不同的结果?
我已经检查了许多不同的方法来轮询我的系统上的RAM; msinfo32.exe,dxdiag,CPU-Z,任务管理器,控制面板\系统。所有这些都列出了8GB的内存,除了dxdiag,更具体地说是8192MB RAM。
我的疑问就是这个。我如何证实任何/所有这些方法的结果?由于数字不匹配,我无法确认第三种方法比前两种方法更准确。我知道我可能会做一些愚蠢的事情,比如转换不正确但在Google的“bytes / kb to gb”转换器中仔细检查自己已经缓解了这一点。
using Microsoft.VisualBasic.Devices;
...
ulong installedMemory = 0;
MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX();
if (GlobalMemoryStatusEx(memStatus))
{
installedMemory = memStatus.ullTotalPhys;
}
//8542273536
MessageBox.Show(installedMemory.ToString());
//8542273536
MessageBox.Show(GetTotalMemoryInBytes().ToString());
GetPhysicallyInstalledSystemMemory(out long memKb);
//8388608
MessageBox.Show(memKb.ToString());
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private class 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;
public MEMORYSTATUSEX()
{
this.dwLength = (uint)Marshal.SizeOf(this);
}
}
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);
static ulong GetTotalMemoryInBytes()
{
return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetPhysicallyInstalledSystemMemory(out long TotalMemoryInKilobytes);
附加信息
我正在将运行我的应用程序的每台计算机的处理时间和内存(以及其他信息)记录到中央数据库,以便我可以交叉检查此信息,并查看不同的计算机规格如何影响处理时间。
答案 0 :(得分:1)
GlobalMemoryStatusEx
的返回值排除了少量无法使用的内存,因为它映射到硬件(如集成图形控制器和DMA范围)。 GetPhysicallyInstalledSystemMemory
只是提供安装的所有RAM的大小,无论其是否可用于操作系统,以防止愤怒的客户返回计算机,因为他们没有获得所有广告字节。但是不要相信我的话,相信docs:
GetPhysicallyInstalledSystemMemory
函数检索金额 从计算机的SMBIOS固件中物理安装的RAM 表。这可能与报告的数量不同GlobalMemoryStatusEx
函数,用于设置ullTotalPhys
成员MEMORYSTATUSEX
结构到物理内存量 可供操作系统使用。记忆量 可用于操作系统的数量可以少于 内存物理安装在电脑上,因为BIOS和一些 驱动程序可以将内存保留为内存映射设备的I / O区域, 使内存对操作系统不可用 应用
换句话说,两个结果都是正确的:您安装了8个GiB物理RAM,其中8542273536个字节实际可用于Windows以进行分配。