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