Usando C #, quiero obtener la cantidad total de RAM que tiene mi computadora. Con PerformanceCounter puedo obtener la cantidad de RAM disponible, configurando:
counter.CategoryName = "Memory";
counter.Countername = "Available MBytes";
Pero parece que no puedo encontrar una manera de obtener la cantidad total de memoria. ¿Cómo haría esto?
Actualizar:
MagicKat: Vi eso cuando estaba buscando, pero no funciona - "¿Te falta un ensamblaje o referencia?". He buscado agregar eso a las referencias, pero no lo veo allí.
c#
memory
performancecounter
Joel
fuente
fuente
this.dwLength = (uint)Marshal.SizeOf(this);
y funciona igual (tuve problemas con el uso de NativeMethods, por lo que esta solución ahora funciona).Añadir una referencia a
Microsoft.VisualBasic
yusing Microsoft.VisualBasic.Devices;
.La
ComputerInfo
clase tiene toda la información que necesitas.fuente
Agregue una referencia a Microsoft.VisualBasic.dll, como alguien mencionado anteriormente. Entonces, obtener la memoria física total es tan simple como esto (sí, lo probé):
static ulong GetTotalMemoryInBytes() { return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory; }
fuente
Todas las respuestas aquí, incluida la aceptada, le darán la cantidad total de RAM disponible para su uso. Y eso puede haber sido lo que OP quería.
Pero si está interesado en obtener la cantidad de RAM instalada , entonces querrá hacer una llamada a la función GetPhysicallyInstalledSystemMemory .
Desde el enlace, en la sección Comentarios:
Código de muestra:
[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."); }
fuente
Si está utilizando Mono, puede que le interese saber que Mono 2.8 (que se lanzará más adelante este año) tendrá un contador de rendimiento que informa el tamaño de la memoria física en todas las plataformas en las que se ejecuta Mono (incluido Windows). Recuperaría el valor del contador usando este fragmento de código:
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); } }
Si está interesado en el código C que proporciona el contador de rendimiento, puede encontrarlo aquí .
fuente
Otra forma de hacer esto es usando las funciones de consulta de .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;
fuente
Microsoft.VisualBasic.Devices
. Y como una sola líneavar Capacity = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory").Get().Cast<ManagementObject>().Sum(x => Convert.ToInt64(x.Properties["Capacity"].Value));
Para aquellos que están usando,
.net Core 3.0
no es necesario usar laPInvoke
plataforma para obtener la memoria física disponible. LaGC
clase ha agregado un nuevo métodoGC.GetGCMemoryInfo
que devuelve unGCMemoryInfo Struct
conTotalAvailableMemoryBytes
como propiedad. Esta propiedad devuelve la memoria total disponible para el recolector de basura (mismo valor que MEMORYSTATUSEX)var gcMemoryInfo = GC.GetGCMemoryInfo(); installedMemory = gcMemoryInfo.TotalAvailableMemoryBytes; // it will give the size of memory in MB var physicalMemory = (double) installedMemory / 1048576.0;
fuente
simplemente puede usar este código para obtener esa información, solo agregue la referencia
using Microsoft.VisualBasic.Devices;
y simplemente usa el siguiente código
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(); }
fuente
// 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"; }
fuente
Podrías usar WMI. Encontré un snippit.
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
fuente
Set
ya no es necesario para VB.NET, ¿es este código VB6?Esta función (
ManagementQuery
) funciona en Windows XP y versiones posteriores: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; }
Uso:
Console.WriteLine(BytesToMb(Convert.ToInt64(ManagementQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem", "TotalPhysicalMemory", "root\\CIMV2"))));
fuente
BytesToMb
viene esa funcion?Compatible con .Net y Mono (probado con Win10 / FreeBSD / CentOS)
Usando
ComputerInfo
código fuente ysPerformanceCounter
para Mono y como respaldo para .Net:using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Security; public class SystemMemoryInfo { private readonly PerformanceCounter _monoAvailableMemoryCounter; private readonly PerformanceCounter _monoTotalMemoryCounter; private readonly PerformanceCounter _netAvailableMemoryCounter; private ulong _availablePhysicalMemory; private ulong _totalPhysicalMemory; public SystemMemoryInfo() { try { if (PerformanceCounterCategory.Exists("Mono Memory")) { _monoAvailableMemoryCounter = new PerformanceCounter("Mono Memory", "Available Physical Memory"); _monoTotalMemoryCounter = new PerformanceCounter("Mono Memory", "Total Physical Memory"); } else if (PerformanceCounterCategory.Exists("Memory")) { _netAvailableMemoryCounter = new PerformanceCounter("Memory", "Available Bytes"); } } catch { // ignored } } public ulong AvailablePhysicalMemory { [SecurityCritical] get { Refresh(); return _availablePhysicalMemory; } } public ulong TotalPhysicalMemory { [SecurityCritical] get { Refresh(); return _totalPhysicalMemory; } } [SecurityCritical] [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)] private static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer); [SecurityCritical] [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); [SecurityCritical] private void Refresh() { try { if (_monoTotalMemoryCounter != null && _monoAvailableMemoryCounter != null) { _totalPhysicalMemory = (ulong) _monoTotalMemoryCounter.NextValue(); _availablePhysicalMemory = (ulong) _monoAvailableMemoryCounter.NextValue(); } else if (Environment.OSVersion.Version.Major < 5) { var memoryStatus = MEMORYSTATUS.Init(); GlobalMemoryStatus(ref memoryStatus); if (memoryStatus.dwTotalPhys > 0) { _availablePhysicalMemory = memoryStatus.dwAvailPhys; _totalPhysicalMemory = memoryStatus.dwTotalPhys; } else if (_netAvailableMemoryCounter != null) { _availablePhysicalMemory = (ulong) _netAvailableMemoryCounter.NextValue(); } } else { var memoryStatusEx = MEMORYSTATUSEX.Init(); if (GlobalMemoryStatusEx(ref memoryStatusEx)) { _availablePhysicalMemory = memoryStatusEx.ullAvailPhys; _totalPhysicalMemory = memoryStatusEx.ullTotalPhys; } else if (_netAvailableMemoryCounter != null) { _availablePhysicalMemory = (ulong) _netAvailableMemoryCounter.NextValue(); } } } catch { // ignored } } private struct MEMORYSTATUS { private uint dwLength; internal uint dwMemoryLoad; internal uint dwTotalPhys; internal uint dwAvailPhys; internal uint dwTotalPageFile; internal uint dwAvailPageFile; internal uint dwTotalVirtual; internal uint dwAvailVirtual; public static MEMORYSTATUS Init() { return new MEMORYSTATUS { dwLength = checked((uint) Marshal.SizeOf(typeof(MEMORYSTATUS))) }; } } private struct MEMORYSTATUSEX { private uint dwLength; internal uint dwMemoryLoad; internal ulong ullTotalPhys; internal ulong ullAvailPhys; internal ulong ullTotalPageFile; internal ulong ullAvailPageFile; internal ulong ullTotalVirtual; internal ulong ullAvailVirtual; internal ulong ullAvailExtendedVirtual; public static MEMORYSTATUSEX Init() { return new MEMORYSTATUSEX { dwLength = checked((uint) Marshal.SizeOf(typeof(MEMORYSTATUSEX))) }; } } }
fuente
Nadie ha mencionado GetPerformanceInfo todavía. Las firmas PInvoke están disponibles.
Esta función pone a disposición la siguiente información de todo el sistema:
PhysicalTotal
es lo que busca el OP, aunque el valor es el número de páginas, por lo que para convertir a bytes, multiplica por elPageSize
valor devuelto.fuente
.NIT tiene un límite a la cantidad de memoria a la que puede acceder del total. Hay un porcentaje, y luego 2 GB en XP fue el límite máximo.
Podría tener 4 GB y mataría la aplicación cuando llegara a 2 GB.
También en el modo de 64 bits, hay un porcentaje de memoria que puede usar fuera del sistema, por lo que no estoy seguro si puede pedirlo todo o si está específicamente protegido.
fuente
/*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"); }
fuente