我想要获得总安装内存

时间:2015-11-29 04:22:24

标签: c#

我正在尝试获取总安装内存。我安装了6GB,但是返回5.47GB。我该怎么做才能解决这个问题?我在x64 PC上进行了构建,并在x64 PC上运行应用程序。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            internal 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(typeof(NativeMethods.MEMORYSTATUSEX));
                }
            }

            [return: MarshalAs(UnmanagedType.Bool)]
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            internal static extern Boolean GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);

public static String GetTotalRam
            {
                get
                {
                    ulong installedMemory = 0;
                    NativeMethods.MEMORYSTATUSEX memStatus = new NativeMethods.MEMORYSTATUSEX();
                    if (NativeMethods.GlobalMemoryStatusEx(memStatus))
                    {
                        installedMemory = memStatus.ullTotalPhys;
                    }
                    return ConvertBytes(installedMemory);
                }
            }

2 个答案:

答案 0 :(得分:3)

您发布的方法为您提供了总可用内存,这与安装内存总量不完全相同。

要获得已安装的内存量,您可以使用GetPhysicallyInstalledSystemMemory功能调用。

我认为您会从该链接中找到备注部分:

  

GetPhysicallyInstalledSystemMemory 函数从计算机的SMBIOS固件表中检索物理安装的RAM量。这可能与 GlobalMemoryStatusEx 函数报告的数量不同,后者将MEMORYSTATUSEX结构的ullTotalPhys成员设置为可供操作系统使用的物理内存量。 操作系统可用的内存量可能小于计算机中物理安装的内存量 ,因为BIOS和某些驱动程序可能会将内存保留为I / O区域对于内存映射设备,使内存对操作系统和应用程序不可用。

编辑:添加了示例代码

从找到的代码here修改:

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetPhysicallyInstalledSystemMemory(out long TotalMemoryInKilobytes);

static void Main()
{
    long memKb;
    GetPhysicallyInstalledSystemMemory(out memKb);
    Console.WriteLine((memKb / 1024 / 1024) + " GB of RAM installed.");
}

答案 1 :(得分:0)

虽然这看起来很奇怪但是添加对Microsoft.VisualBasic.dll的引用并使用它:

return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;