Cómo obtener los datos básicos de todos los slots de memoria RAM del equipo (bancos de memoria), así como la memoria RAM total (Capacity, Speed, SerialNumber, PartNumber, Manufacturer, DeviceLocator, DataWidth, ConfiguredClockSpeed, BankLabel, FormFactor, Tag, etc.). Usaremos WMI (Windows Management Instrumentation) y Visual Studio .Net con C# (C Sharp). Incluimos descarga del código fuente completo y gratuito de la aplicación de ejemplo. Para el desarrollo de esta aplicación se usa .NET 6 y Visual Studio .Net Community 2022.
- Crear clase InvSlotRAM.cs en Visual Studio .Net CSharp.
- Crear clase Inventario.cs en Visual Studio .Net CSharp.
- Formulario para probar las clases anteriores y obtener los slots de RAM y sus datos con WMI y C#.
- Aplicación ProyectoA – Obtener Slots RAM WMI en funcionamiento.
- Descarga del código fuente en C# de Visual Studio .Net Community 2022 de la aplicación completa.
Crear clase InvSlotRAM.cs en Visual Studio .Net CSharp
En primer lugar, para almacenar la información de cada impresora del equipo, crearemos una clase llamada InvImpresora.cs. Para ello, pulsaremos con el botón derecho del ratón sobre la solución y elegiremos «Agregar» – «Clase…»:
Introduciremos el nombre de la clase (en nuestro caso InvSlotRAM.cs) y pulsaremos «Aceptar»:
Añadiremos el siguiente código fuente C# a la clase creada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
namespace ProyectoA_Obtener_Slots_RAM { public class InvSlotRAM { public long Capacity { get; set; } public int Speed { get; set; } public string SerialNumber { get; set; } public string PartNumber { get; set; } public string Manufacturer { get; set; } public string DeviceLocator { get; set; } public string DataWidth { get; set; } public int ConfiguredClockSpeed { get; set; } public string BankLabel { get; set; } public string FormFactor { get; set; } public string Tag { get; set; } public InvSlotRAM() { Capacity = 0; Speed = 0; SerialNumber = ""; PartNumber = ""; Manufacturer = ""; DeviceLocator = ""; DataWidth = ""; ConfiguredClockSpeed = 0; BankLabel = ""; FormFactor = ""; Tag = ""; } } } |
Crear clase Inventario.cs en Visual Studio .Net CSharp
De la misma forma, crearemos la clase en la que añadiremos todos los métodos de nuestra aplicación C#. Entre ellos, el método para obtener los datos de cada slot de RAM del equipo, usando la clase InvSlotRAM.cs anterior para almacenar una lista de clases (lista de slots de RAM). De esta forma obtendremos todos los datos de todos los slots de RAM (bancos de memoria RAM) del equipo (en una lista de miembros de la clase InvSlotRAM.cs).
El código fuente de la clase Inventario.cs será:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
using System.Management; namespace ProyectoA_Obtener_Slots_RAM { class Inventario { //Obtener lista de módulos de memoria RAM instalados en el equipo mediante WMI public static List<InvSlotRAM>? ObtenerSlotRAM(bool Windows7_2008_2012, ref long RAMTotal) { List<InvSlotRAM> elementos = new(); long RAMTotalObtenida = 0; try { String wSQL; if (Windows7_2008_2012) //Si es Windows 7, o Windows Server 2008 o Windows Server 2012 quitamos la propiedad ConfiguredClockSpeed wSQL = "SELECT Capacity, Speed, SerialNumber, PartNumber, Manufacturer, DeviceLocator, DataWidth, BankLabel, FormFactor, Tag FROM Win32_PhysicalMemory"; else wSQL = "SELECT Capacity, Speed, SerialNumber, PartNumber, Manufacturer, DeviceLocator, DataWidth, ConfiguredClockSpeed, BankLabel, FormFactor, Tag FROM Win32_PhysicalMemory"; ManagementObjectSearcher objBusquedaWMI = new ManagementObjectSearcher(wSQL); foreach (ManagementObject propiedad in objBusquedaWMI.Get().Cast<ManagementObject>()) { InvSlotRAM elemActual = new(); try { if (!long.TryParse(Convert.ToString(propiedad["Capacity"]), out long capacidad)) capacidad = 0; elemActual.Capacity = capacidad; RAMTotalObtenida += capacidad; } catch { elemActual.Capacity = 0; } try { if (!int.TryParse(Convert.ToString(propiedad["Speed"]), out int speed)) speed = 0; elemActual.Speed = speed; } catch { elemActual.Speed = 0; } try { elemActual.SerialNumber = Convert.ToString(propiedad["SerialNumber"]); } catch { elemActual.SerialNumber = ""; } try { elemActual.PartNumber = Convert.ToString(propiedad["PartNumber"]); } catch { elemActual.PartNumber = ""; } try { elemActual.Manufacturer = Convert.ToString(propiedad["Manufacturer"]); } catch { elemActual.Manufacturer = ""; } try { elemActual.DeviceLocator = Convert.ToString(propiedad["DeviceLocator"]); } catch { elemActual.DeviceLocator = ""; } try { elemActual.DataWidth = Convert.ToString(propiedad["DataWidth"]); } catch { elemActual.DataWidth = ""; } if (!Windows7_2008_2012) { try { elemActual.ConfiguredClockSpeed = Convert.ToInt16(propiedad["ConfiguredClockSpeed"]); } catch { elemActual.ConfiguredClockSpeed = 0; } } else elemActual.ConfiguredClockSpeed = 0; try { elemActual.BankLabel = Convert.ToString(propiedad["BankLabel"]); } catch { elemActual.BankLabel = ""; } try { elemActual.FormFactor = Convert.ToString(propiedad["FormFactor"]); } catch { elemActual.FormFactor = ""; } try { elemActual.Tag = Convert.ToString(propiedad["Tag"]); } catch { elemActual.Tag = ""; } RAMTotal += elemActual.Capacity; elementos.Add(elemActual); } } catch (Exception error) { string texto = $"Error al obtener slots de RAM del equipo con WMI. Error: {error.Message}"; MessageBox.Show(texto, "Error al obtener slots de RAM...", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } return elementos; } } } |
Si algún método da error, como ManagementObjectSearcher, podremos instalarlo directamente desde el código, pasando el ratón por encima del error y pulsando en la bombilla. Mostrará un menú emergente donde indicará «Instalar paquete «System.Management» – «Buscar e instalar la última versión»:
Lo que hará Visual Studio .Net será instalar el paquete necesario por nosotros, agregará el using:
1 |
using System.Management; |
Y agregará la referencia a este paquete (System.Management) para nuestro proyecto:
Todo esto, evidentemente, podemos hacerlo nosotros mismos de forma manual, pero ya hemos comprobado que de forma automática se instala correctamente y es más rápido.
Formulario para probar las clases anteriores y obtener los slots de RAM y sus datos con WMI y C#
Crearemos un formulario con un Button y un TextBox (con propiedad Multiline = True). Añadiremos también un Label, que será donde mostremos la cantidad de RAM total del equipo:
En el evento Click del Button añadiremos el siguiente código para obtener los bancos de memoria RAM del equipo y la suma de la memoria RAM total (suma de la capacidad de cada slot/banco) y sus datos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
private void btObtenerImpresoras_Click(object sender, EventArgs e) { string texto = ""; string nombreSO = "Windows"; long RAMTotal = 0; //Obtenemos primero el nombre del sistema operativo (lo necesitamos para ejecutar la consulta WMI) var nombreSOV = Environment.GetEnvironmentVariable(""); if (nombreSOV != null) nombreSO = nombreSOV; //Obtenemos la lista de impresoras del equipo var lsSlotsRAM = Inventario.ObtenerSlotRAM(Windows7_2008_2012: nombreSO.Contains("Windows 7") || nombreSO.Contains("Server 2008") || nombreSO.Contains("Server 2012"), RAMTotal: ref RAMTotal); lRAMTotal.Text = $"RAM total: {RAMTotal / 1024 / 1024 / 1024} GB"; if (lsSlotsRAM != null) { //Recorremos todos los elementos de la lista de tipo InvImpresora foreach (InvSlotRAM slotRAM in lsSlotsRAM) { //Guardamos los datos del slot de RAM actual en texActual //Separamos cada propiedad con un salto de línea string texActual = $"BankLabel: [{slotRAM.BankLabel}]" + $"\r\n DeviceLocator: [{slotRAM.DeviceLocator}]" + $"\r\n Tag: [{slotRAM.Tag}]" + $"\r\n Capacity: [{slotRAM.Capacity} Bytes] [{slotRAM.Capacity / 1024 / 1024 / 1024} GB]" + $"\r\n Speed: [{slotRAM.Speed} MHz]" + $"\r\n SerialNumber: [{slotRAM.SerialNumber}]" + $"\r\n Manufacturer: [{slotRAM.Manufacturer}]" + $"\r\n DataWidth: [{slotRAM.DataWidth}]" + $"\r\n FormFactor: [{slotRAM.FormFactor}]"; //Si es el primer slot de RAM añadimos el textActual, si es el segundo //o sucesivos, añadimos un salto de línea antes para separarlos texto += texto == "" ? texActual : $"\r\n{texActual}"; } } txtSlotRAM.Text = texto; } |
Aplicación ProyectoA – Obtener Slots RAM WMI en funcionamiento
Probaremos la aplicación que obtiene los bancos de memoria RAM del equipo y sus datos. Para ello compilaremos el código fuente anterior pulsando F5. Una vez ejecutada la aplicación, pulsaremos en el botón «Obtener slots RAM». Devolverá en el cuadro de texto todos los bancos de memoria RAM (slots) del equipo y sus datos:
Por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
BankLabel: [BANK 0] DeviceLocator: [ChannelA-DIMM0] Tag: [Physical Memory 0] Capacity: [17179869184 Bytes] [16 GB] Speed: [3200 MHz] SerialNumber: [00000000] Manufacturer: [859B] DataWidth: [64] FormFactor: [8] BankLabel: [BANK 2] DeviceLocator: [ChannelB-DIMM0] Tag: [Physical Memory 2] Capacity: [17179869184 Bytes] [16 GB] Speed: [3200 MHz] SerialNumber: [00000000] Manufacturer: [859B] DataWidth: [64] FormFactor: [8] |
Descarga del código fuente en C# de Visual Studio .Net Community 2022 de la aplicación completa
Para descargar el código fuente completo de este ejemplo WMI con C#, en Visual Studio .Net Community 2022, con .NET 6.0, accede al siguiente enlace (es completamente gratuito):