你如何获得计算机的RAM总量?

使用C#,我想获得我的电脑有RAM的总量。 通过PerformanceCounter,我可以通过设置来获得可用RAM的数量:

counter.CategoryName = "Memory"; counter.Countername = "Available MBytes"; 

但我似乎无法find一种方法来获得总的内存量。 我怎么去做这个?

更新:

MagicKat:我看到了,当我search时,但它不起作用 – “你错过了一个汇编或参考?”。 我期待添加到参考,但我没有看到它。

p / invoke方式编辑 :改为GlobalMemoryStatusEx给出准确的结果(heh)

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private 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)] static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer); 

然后使用像:

 ulong installedMemory; MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX(); if( GlobalMemoryStatusEx( memStatus)) { installedMemory = memStatus.ullTotalPhys; } 

或者可以使用WMI(托pipe但较慢)在“Win32_ComputerSystem”类中查询“TotalPhysicalMemory”。

编辑来自joel-llamaduck.blogspot.com的每条评论的固定代码

添加对Microsoft.VisualBasic的引用和using Microsoft.VisualBasic.Devices;

ComputerInfo类具有您需要的所有信息。

像上面提到的那样添加对Microsoft.VisualBasic.dll的引用。 然后获得完整的物理内存就像这样简单(是的,我testing了它):

 static ulong GetTotalMemoryInBytes() { return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory; } 

如果你碰巧使用的是单声道,那么你可能有兴趣知道Mono 2.8(将在今年晚些时候发布)将会有一个性能计数器,它报告Mono运行的所有平台(包括Windows)的物理内存大小。 您将使用以下代码片段检索计数器的值:

 using System; using System.Diagnostics; class app { static void Main () { var pc = new PerformanceCounter ("Mono Memory", "Total Physical Memory"); Console.WriteLine ("Physical RAM (bytes): {0}", pc.RawValue); } } 

如果您对提供性能计数器的C代码感兴趣,可以在这里find它。

这里所有的答案,包括接受的答案,都会给你可用 RAM的总量。 这可能是OP想要的。

但是,如果您有兴趣获得已安装的 RAM的数量,那么您将需要调用GetPhysicallyInstalledSystemMemory函数。

从链接中的备注部分:

GetPhysicallyInstalledSystemMemory函数从计算机的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."); } 

另一种方法是使用.NET System.Management查询工具:

 string Query = "SELECT Capacity FROM Win32_PhysicalMemory"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(Query); UInt64 Capacity = 0; foreach (ManagementObject WniPART in searcher.Get()) { Capacity += Convert.ToUInt64(WniPART.Properties["Capacity"].Value); } return Capacity; 

你可以简单地使用这个代码来获取这些信息,只需添加引用

 using Microsoft.VisualBasic.Devices; 

并简单地使用下面的代码

  private void button1_Click(object sender, EventArgs e) { getAvailableRAM(); } public void getAvailableRAM() { ComputerInfo CI = new ComputerInfo(); ulong mem = ulong.Parse(CI.TotalPhysicalMemory.ToString()); richTextBox1.Text = (mem / (1024*1024) + " MB").ToString(); } 

你可以使用WMI。 发现了一个小窍门。

 Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colComputer = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") For Each objComputer in colComputer strMemory = objComputer.TotalPhysicalMemory Next 
 // use `/ 1048576` to get ram in MB // and `/ (1048576 * 1024)` or `/ 1048576 / 1024` to get ram in GB private static String getRAMsize() { ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject item in moc) { return Convert.ToString(Math.Round(Convert.ToDouble(item.Properties["TotalPhysicalMemory"].Value) / 1048576, 0)) + " MB"; } return "RAMsize"; } 

此function( ManagementQuery )适用于Windows XP和更高版本:

 private static string ManagementQuery(string query, string parameter, string scope = null) { string result = string.Empty; var searcher = string.IsNullOrEmpty(scope) ? new ManagementObjectSearcher(query) : new ManagementObjectSearcher(scope, query); foreach (var os in searcher.Get()) { try { result = os[parameter].ToString(); } catch { //ignore } if (!string.IsNullOrEmpty(result)) { break; } } return result; } 

用法:

 Console.WriteLine(BytesToMb(Convert.ToInt64(ManagementQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem", "TotalPhysicalMemory", "root\\CIMV2")))); 

目前还没有人提到GetPerformanceInfo 。 PInvoke签名是可用的。

该function使以下系统范围的信息可用:

  • CommitTotal
  • CommitLimit
  • CommitPeak
  • PhysicalTotal
  • PhysicalAvailable
  • SystemCache
  • KernelTotal
  • KernelPaged
  • KernelNonpaged
  • 每页
  • HandleCount
  • ProcessCount
  • THREADCOUNT

PhysicalTotal是OP所要查找的内容,虽然值是页数,所以要转换为字节,再乘以返回的PageSize值。

.NIT可以访问的内存总量有限制。 有一个百分比,然后在XP的2 GB是硬的天花板。

你可以有4 GB的,它会杀了应用程序,当它达到2GB。

在64位模式下,还有一部分内存可以用于系统外部,所以我不确定是否可以请求整个系统,或者是否特别防范。

 /*The simplest way to get/display total physical memory in VB.net (Tested) public sub get_total_physical_mem() dim total_physical_memory as integer total_physical_memory=CInt((My.Computer.Info.TotalPhysicalMemory) / (1024 * 1024)) MsgBox("Total Physical Memory" + CInt((My.Computer.Info.TotalPhysicalMemory) / (1024 * 1024)).ToString + "Mb" ) end sub */ //The simplest way to get/display total physical memory in C# (converted Form http://www.developerfusion.com/tools/convert/vb-to-csharp) public void get_total_physical_mem() { int total_physical_memory = 0; total_physical_memory = Convert.ToInt32((My.Computer.Info.TotalPhysicalMemory) / (1024 * 1024)); Interaction.MsgBox("Total Physical Memory" + Convert.ToInt32((My.Computer.Info.TotalPhysicalMemory) / (1024 * 1024)).ToString() + "Mb"); }