VisualBasic.Devices中的TotalPhysicalMemory与WMI Win32_PhysicalMemory略有不同

时间:2015-08-09 12:00:13

标签: c# wmi ram

所以我的应用程序需要知道可用的总RAM。至于存在至少4种不同的方式:

我喜欢前两个,但是他们在我的机器上给出了略微不同的结果(2支2GB,Windows 8.1 64位)。

我用来从VisualBasic dll获取它的代码:

class Program
{
    private static readonly Lazy<ComputerInfo> ComputerInfo = new Lazy<ComputerInfo>();
    public static ulong TotalRam => ComputerInfo.Value.TotalPhysicalMemory;

    static void Main(string[] args)
    {
        Console.WriteLine("Total RAM from ComputerInfo: {0} bytes", TotalRam);
        // Result: Total RAM from ComputerInfo: 4292902912 bytes
    }
}

我用来从Windows Management获取它的代码:

class Program
{
    public static IEnumerable<object> GetResults(string win32ClassName, string property)
    {
        return (from x in new ManagementObjectSearcher("SELECT * FROM " + win32ClassName).Get().OfType<ManagementObject>()
                select x.GetPropertyValue(property));
    }
    public static ulong? TotalInstalledBytes
    {
        get
        {
            var values = GetResults("Win32_PhysicalMemory", "Capacity");
            ulong? sum = null;
            foreach (var item in values)
            {
                var casted = item as ulong?;
                if (casted.HasValue)
                {
                    if (sum == null) sum = 0;
                    sum += casted.Value;
                }
            }
            return sum;
        }
    }
    static void Main(string[] args)
    {
        Console.WriteLine("Total RAM from WMI: {0} bytes", TotalInstalledBytes);
        // Result: Total RAM from WMI: 4294967296 bytes
    }
}

差异略小于2 MB,2064384字节或2016 kB。 我的问题是:为什么会这样?

我的猜测是:

  • VisualBasic ComputerInfo返回从OS看到的内存 透视,而WMI使用制造商&#39;硬编码&#39;值
  • VisualBasic ComputerInfo返回真正存在的内存(它 出现,商业上可用的记忆棒很少有 精确的字节数),而WMI使用制造商&#39;硬编码&#39; 值

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

这可能与您的情况有关:

  

<强> TotalPhysicalMemory

     

物理内存的总大小。请注意,在某些情况下,此属性可能无法返回物理内存的准确值。例如,如果BIOS使用某些物理内存,则不准确。要获得准确的值,请改用Win32_PhysicalMemory中的Capacity属性。

Source