你如何获得计算机的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"); }