c# - obtener - ¿Cómo se obtiene la cantidad total de RAM que tiene la computadora?
obtener memoria ram c# (13)
.NIT tiene un límite en la cantidad de memoria a la que puede acceder del total. Hay un porcentaje, y luego 2 GB en xp era el techo duro.
Podrías tener 4 GB dentro, y mataría a la aplicación cuando alcance los 2GB.
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 de si puede solicitar todo o si está específicamente protegido.
Usando C #, quiero obtener la cantidad total de RAM que tiene mi computadora. Con el PerformanceCounter puedo obtener la cantidad de RAM disponible, estableciendo:
counter.CategoryName = "Memory";
counter.Countername = "Available MBytes";
Pero parece que no puedo encontrar la manera de obtener la cantidad total de memoria. ¿Cómo voy a hacer esto?
Actualizar:
MagicKat: Lo vi cuando estaba buscando, pero no funciona - "¿Te falta una asamblea o referencia?". He buscado agregar eso a las referencias, pero no lo veo allí.
Agregue una referencia a Microsoft.VisualBasic
y a using Microsoft.VisualBasic.Devices;
.
La clase ComputerInfo
tiene toda la información que necesita.
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;
}
Esta función ( ManagementQuery
) funciona en Windows XP y posterior:
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"))));
La forma p / invoke EDIT : se cambió a GlobalMemoryStatusEx para dar resultados precisos (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);
Luego usa como:
ulong installedMemory;
MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX();
if( GlobalMemoryStatusEx( memStatus))
{
installedMemory = memStatus.ullTotalPhys;
}
O puede usar WMI (administrado pero más lento) para consultar "TotalPhysicalMemory" en la clase "Win32_ComputerSystem".
Edite el código fijo por comentario de joel-llamaduck.blogspot.com
Nadie ha mencionado GetPerformanceInfo todavía. Las firmas de PInvoke están disponibles.
Esta función hace que esté disponible la siguiente información de todo el sistema:
- CommitTotal
- CommitLimit
- CommitPeak
- PhysicalTotal
- PhysicalAvailable
- SystemCache
- KernelTotal
- KernelPaged
- KernelNonpaged
- Tamaño de página
- HandleCount
- ProcessCount
- Número de hilos
PhysicalTotal
es lo que busca el OP, aunque el valor es el número de páginas, por lo que para convertirlo a bytes, multiplique por el valor de PageSize
devuelto.
Otra forma de hacerlo es mediante el uso del sistema .NET. Facilidades de consulta de gestión:
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;
Podría 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
Si está usando Mono, le puede interesar 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ías 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, se puede encontrar here .
Todas las respuestas aquí, incluida la aceptada, le darán la cantidad total de RAM disponible para su uso. Y eso pudo haber sido lo que OP quería.
Pero si está interesado en obtener la cantidad de RAM instalada , querrá hacer una llamada a la función GetPhysicallyInstalledSystemMemory .
Desde el enlace, en la sección de Comentarios:
La función GetPhysicallyInstalledSystemMemory recupera la cantidad de RAM instalada físicamente de las tablas de firmware SMBIOS de la computadora. Esto puede diferir de la cantidad reportada por la función GlobalMemoryStatusEx , que establece el miembro ullTotalPhys de la estructura MEMORYSTATUSEX en la cantidad de memoria física disponible para que el sistema operativo la use. La cantidad de memoria disponible para el sistema operativo puede ser menor que la cantidad de memoria instalada físicamente en la computadora porque el BIOS y algunos controladores pueden reservar memoria como regiones de E / S para dispositivos mapeados en memoria, lo que hace que la memoria no esté disponible para el sistema operativo y aplicaciones.
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.");
}
simplemente puede usar este código para obtener esa información, simplemente 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();
}
/*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");
}
// 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";
}