94 votes

Comment voulez-vous obtenir la quantité totale de mémoire RAM de l'ordinateur?

Je suis désireux d'obtenir la quantité totale de RAM sur mon ordinateur, à l'aide de C#. À l'aide de la PerformanceCounter je peux obtenir la quantité de ram Disponible, en définissant:

counter.CategoryName = "Memory";
counter.Countername = "Available MBytes";

Mais je n'arrive pas à trouver un moyen d'obtenir la quantité totale de mémoire. Comment pourrais-je aller sur le faire?

Mise à jour:

MagicKat: j'ai vu que quand j'étais à la recherche, mais elle ne fonctionne pas - "vous manque une assemblée ou une référence?". J'ai cherché à ajouter que, pour les Références, mais je ne vois pas là.

186voto

MagicKat Points 5192

Ajouter une référence à Microsoft.VisualBasic et une aide de Microsoft.VisualBasic.Les appareils. Le ComputerInfo classe contient toutes les informations dont vous avez besoin.

66voto

Philip Rieck Points 21405

Le p/invoke façon EDIT : modification GlobalMemoryStatusEx pour donner des résultats précis (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);

Ensuite, à utiliser comme:

ulong installedMemory;
MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX();
if( GlobalMemoryStatusEx( memStatus))
{ 
   installedMemory = memStatus.ullTotalPhys;
}

Ou vous pouvez utiliser WMI (géré mais plus lent) pour la requête "TotalPhysicalMemory" dans le "Win32_ComputerSystem" de la classe.

Modifier code fixe par de commentaire joel-llamaduck.blogspot.com

65voto

Kyralessa Points 76456

Ajouter une référence à Microsoft.VisualBasic.dll, comme quelqu'un l'a mentionné ci-dessus. L'obtention de mémoire physique totale est aussi simple que cela (oui, je l'ai testé):

static ulong GetTotalMemoryInBytes()
{
    return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;
}

32voto

grendel Points 276

Si vous arrive d'être en utilisant Mono, alors vous pourriez être intéressés de savoir que les Mono 2.8 (pour être publié plus tard cette année) aura un compteur de performance qui relève de la taille de la mémoire physique sur toutes les plates-formes Mono s'exécute sur (y compris Windows). Vous serait de récupérer la valeur du compteur à l'aide de cet extrait de code:

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 vous êtes intéressé par un code C qui fournit le compteur de performance, il peut être trouvé ici.

5voto

CodeRot Points 785

Vous pouvez utiliser WMI. Trouvé 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X