我正在编写一个监视硬件组件的程序,我正在尝试使用WMI Win32_ComptuterSystem
类来获取桌面的RAM容量。我设法获得了总RAM的数量,但是它以位而不是GB表示,我知道我必须进行转换,但是我不知道该如何处理。
private void GetRamCapacity()
{
var wmi = new ManagementClass("Win32_ComputerSystem");
var providers = wmi.GetInstances();
foreach (var provider in providers)
{
var ramCapacity = Convert.ToInt32(provider["TotalPhysicalMemory"]);
lblRAMCapacity.Text = ramCapacity.ToString();
}
}
答案 0 :(得分:1)
请注意,TotalPhysicalMemory返回一个 UInt64
值。
将其转换为ulong
而不是Int32
。另外,该值以 Bytes
表示:
但是您可能应该使用Win32_PhysicalMemory类的Capacity
属性返回的值。每个存储库都提供了容量值。
原因在注释中说明:
请注意,在某些情况下,此属性可能不会返回 物理内存的准确值。例如,不是 如果BIOS正在使用某些物理内存,则准确无误。
来自GetPhysicallyInstalledSystemMemory:
BIOS和某些驱动程序可能会将内存保留为I / O区域,用于 内存映射的设备,使内存无法运行 系统和应用程序。
Win32_PhysicalMemory.Capacity
返回的值总和与 GetPhysicallyInstalledSystemMemory
返回的值相同(后者以千字节为单位)。< br />
机器必须具有SMBIOS功能(Windows XP和更高版本),否则这些功能将不会返回值。
一个例子:
ulong totalMemory = WMIGetTotalPhysicalMemory();
string memory = $"{totalMemory / Math.Pow(1024, 3):N2} GB";
WMIGetTotalPhysicalMemory()
方法使用每个存储区WMI
的{{1}} Win32_PhysicalMemory
类,对每个存储区的已安装内存大小求和。
Capacity
使用 public static ulong WMIGetTotalPhysicalMemory()
{
ManagementScope mScope = new ManagementScope($@"\\{Environment.MachineName}\root\CIMV2");
SelectQuery mQuery = new SelectQuery("SELECT * FROM Win32_PhysicalMemory");
mScope.Connect();
ulong installedMemory = 0;
using (ManagementObjectSearcher moSearcher = new ManagementObjectSearcher(mScope, mQuery))
{
foreach (ManagementObject moCapacity in moSearcher.Get()) {
installedMemory += (UInt64)moCapacity["Capacity"];
}
}
return installedMemory;
}
的比较方法:
(此值和GetPhysicallyInstalledSystemMemory()
返回的值必须相同)
WMIGetTotalPhysicalMemory
ulong totalMemory = WinAPIGetTotalPhysicalMemory();
使用GlobalMemoryStatusEx()的替代方法。
此函数返回一个MEMORYSTATUSEX
结构,该结构引用物理和虚拟内存的当前状态,以及正在使用的物理内存的大约百分比。
请注意,这些值是易失的,将在两次调用之间发生变化:内存状态会不断变化。
有关这些值的含义,请参见MSDN注释。
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetPhysicallyInstalledSystemMemory(out ulong MemKilobytes);
public static ulong WinAPIGetTotalPhysicalMemory()
{
ulong totalMemory = 0UL;
GetPhysicallyInstalledSystemMemory(out totalMemory);
return totalMemory * 1024;
}
MEMORYSTATUSEX memoryStatus = GetSystemMemoryStatus();