Search code examples
c#memoryperformancecounter

How do you get total amount of RAM the computer has?


Using C#, I want to get the total amount of RAM that my computer has. With the PerformanceCounter I can get the amount of Available ram, by setting:

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

But I can't seem to find a way to get the total amount of memory. How would I go about doing this?

Update:

MagicKat: I saw that when I was searching, but it doesn't work - "Are you missing an assembly or reference?". I've looked to add that to the References, but I don't see it there.


Solution

  • The Windows API function GlobalMemoryStatusEx can be called with p/invoke:

      [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);
    

    Then use like:

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

    Or you can use WMI (managed but slower) to query TotalPhysicalMemory in the Win32_ComputerSystem class.