如何使用Win32_ComputerSystem类

时间:2019-02-02 18:38:03

标签: c#

我正在编写一个监视硬件组件的程序,我正在尝试使用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();         
    }
}

1 个答案:

答案 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();