我正在尝试获取已安装的内存总量

本文关键字:安装 内存 获取 | 更新日期: 2023-09-27 18:24:51

我正在尝试获取安装的总内存。我安装了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);
                }
            }

我正在尝试获取已安装的内存总量

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

要获取已安装的内存量,可以使用对GetPhysicalyInstalledSystemMemory函数的调用。

我想你会发现链接中的备注部分很有趣:

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

编辑:添加示例代码

根据此处的代码修改:

[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.");
}

尽管这看起来很奇怪,但添加对Microsoft.VisualBasic.dll的引用并使用以下内容:

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