C# la gestione della RAM con .NET 10

Articolo che illustra una tecnica per rilevare informazioni sulla RAM installato sul proprio pc.

Emanuele Mattei
Sviluppatore Microsoft .Net. Collaboratore

In questo articolo vedremo come realizzare un'applicazione Windows Forms in C# con .NET 10 per ottenere informazioni sulla memoria RAM del computer.

Attraverso alcuni esempi pratici analizzeremo l'utilizzo del namespace System.Management e della classe ManagementObject, che consentono di accedere a diverse informazioni hardware e di sistema tramite la tecnologia WMI (Windows Management Instrumentation).

L'intero esempio verrà sviluppato all'interno di un progetto Windows Forms.

Creazione del progetto

Creiamo un nuovo progetto di tipo Windows Forms utilizzando .NET 10, la versione più recente disponibile al momento della stesura di questo articolo.

Inseriamo un controllo GroupBox e impostiamo la proprietà Text sul valore "RAM".

Aggiungiamo quindi 8 controlli Label e 8 controlli TextBox. Per ciascun controllo TextBox impostiamo la proprietà ReadOnly su true, in modo che il contenuto possa essere visualizzato ma non modificato dall'utente.

Disponiamo le etichette in colonna e, accanto a esse, le relative caselle di testo, come illustrato nella Figura 1.

Figura 1 - La disposizione dei controlli

Figura 1 - La disposizione dei controlli

Impostiamo la proprietà Text dei controlli Label con i testi illustrati nella Figura 1.

Assegniamo inoltre ai controlli TextBox i seguenti nomi:

TxtSlotTotali
TxtSlotOccupati
TxtSlotLiberi
TxtRamTotale
TxtVelocita
TxtTipoRam
TxtProduttore
TxtSlotRam
Stesura del codice

Terminata la progettazione della form e il posizionamento dei vari controlli, passiamo alla visualizzazione del codice.

Per prima cosa aggiungiamo, all'inizio del file, la direttiva using relativa al namespace System.Management, che mette a disposizione le classi necessarie per accedere alle informazioni hardware del computer tramite WMI (Windows Management Instrumentation).

Di seguito è riportata la direttiva da inserire:

C#
using System.Management;

Rimanendo nella visualizzazione del codice, scriviamo una funzione denominata GetTipoRAM. La funzione restituisce un valore di tipo string e riceve come parametro un valore di tipo int, corrispondente al codice del tipo di memoria restituito da WMI.

Attraverso una struttura di selezione, il codice numerico viene convertito nella relativa descrizione del tipo di RAM installata nel computer.

Di seguito è riportato il codice della funzione.

C#
/// <summary>
/// Funzione che permette di rilevare il tipo di RAM
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
string GetTipoRAM(int type)
{
   return type switch
   {
       20 => "DDR",
       21 => "DDR2",
       24 => "DDR3",
       26 => "DDR4",
       34 => "DDR5",
       _ => $"Sconosciuto (codice {type})"
   };
}

Creiamo una funzione denominata GetInfoRAM, con la quale otteniamo le informazioni relative alla memoria RAM utilizzando le classi ManagementObjectSearcher e ManagementObject.

La funzione esegue una query WMI sulla classe Win32_PhysicalMemory, dalla quale vengono recuperate le informazioni relative ai moduli di memoria installati nel computer.

I dati ottenuti vengono quindi assegnati ai rispettivi controlli TextBox presenti nella finestra.

Di seguito è riportato il frammento di codice della funzione.

C#
      private void GetInfoRAM() {
          try
          {
              var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemory");
              var moduli = searcher.Get();
              long totaleRam = 0;
              int moduliInstallati = 0;
              string tipoRam = "";
              string Produttore = "";
              string SlotRam = "";
              foreach (ManagementObject module in moduli)
              {
                  moduliInstallati++;
                  long capacita = Convert.ToInt64(module["Capacity"]);
                  int smbiosType = Convert.ToInt32(module["SMBIOSMemoryType"]);
                  totaleRam += capacita;
                  SlotRam = module["DeviceLocator"]?.ToString();
                  tipoRam  = GetTipoRAM(smbiosType);
                  Produttore = module["Manufacturer"]?.ToString();
              }
              var arraySearcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemoryArray");
              var arrays = arraySearcher.Get();
              int totaleSlots = 0;
              foreach (ManagementObject arr in arrays)
              {
                  totaleSlots += Convert.ToInt32(arr["MemoryDevices"]);
              }
              TxtSlotTotali.Text = totaleSlots.ToString();
              TxtSlotOccupati.Text = moduliInstallati.ToString();
              TxtSlotLiberi.Text = ( totaleSlots - moduliInstallati).ToString();
              TxtRamTotale.Text = (totaleRam / (1024 * 1024 * 1024)).ToString() + " GB";
              TxtVelocita.Text = moduli.Count >0 ? moduli.Cast<ManagementObject>().First()["Speed"]?.ToString() + " MHz" : "N/A";
              txtTipoRam.Text = tipoRam;
              TxtProduttore.Text = Produttore;
              TxtSlotRam.Text = SlotRam;
          }
          catch (Exception ex)
          {
              MessageBox.Show("Errore: " + ex.Message);
          }
      }

Torniamo alla visualizzazione grafica del progetto per visualizzare i controlli inseriti nella Form.

Facciamo doppio clic in un punto qualsiasi della Form per generare automaticamente l'evento Load e passare alla visualizzazione del codice.

All'interno dell'evento Load richiamiamo la funzione GetInfoRAM creata in precedenza, così da caricare le informazioni sulla memoria RAM all'avvio dell'applicazione.

Di seguito è riportato il frammento di codice che richiama la funzione nell'evento Load della Form.

C#
private void FrmInformazioniPC_Load(object sender, EventArgs e)
{
    try
    {
         GetInfoRAM();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Conclusioni

In questo articolo abbiamo visto come ottenere informazioni sulla memoria RAM di un computer utilizzando il linguaggio di programmazione C# all'interno di un progetto Windows Forms basato su .NET 10.

L'esempio proposto utilizza esclusivamente le classi messe a disposizione dal namespace System.Management, senza ricorrere a librerie di terze parti, dimostrando come sia possibile interrogare il sistema operativo per recuperare informazioni hardware tramite WMI.

Le classi del namespace System.Management consentono inoltre di ottenere informazioni su numerosi altri componenti hardware e software del computer, offrendo agli sviluppatori gli strumenti necessari per realizzare applicazioni di diagnostica, monitoraggio e inventario del sistema.