Как вы получаете общий объем оперативной памяти компьютера? - PullRequest
71 голосов
/ 20 сентября 2008

Используя C #, я хочу получить общий объем оперативной памяти, который есть на моем компьютере. С PerformanceCounter я могу получить количество доступных оперативной памяти, установив:

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

Но я не могу найти способ получить общий объем памяти. Как бы я поступил так?

Обновление:

MagicKat: я видел это, когда искал, но он не работает - «Вы пропустили сборку или ссылку?». Я надеялся добавить это в Список литературы, но там его не вижу.

Ответы [ 14 ]

169 голосов
/ 20 сентября 2008

Добавить ссылку на Microsoft.VisualBasic и using Microsoft.VisualBasic.Devices;.

Класс ComputerInfo содержит всю необходимую вам информацию.

57 голосов
/ 20 сентября 2008

Добавьте ссылку на Microsoft.VisualBasic.dll, как кто-то упоминал выше. Тогда получить полную физическую память так же просто (да, я проверял это):

static ulong GetTotalMemoryInBytes()
{
    return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;
}
57 голосов
/ 20 сентября 2008

Способ p / invoke EDIT : изменен на GlobalMemoryStatusEx для получения точных результатов (хе)

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

Тогда используйте как:

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

Или вы можете использовать WMI (управляемый, но медленнее) для запроса «TotalPhysicalMemory» в классе «Win32_ComputerSystem».

Редактировать фиксированный код для комментария от joel-llamaduck.blogspot.com

29 голосов
/ 16 апреля 2010

Если вы используете Mono, вам может быть интересно узнать, что Mono 2.8 (будет выпущен позднее в этом году) будет иметь счетчик производительности, который сообщает размер физической памяти на всех платформах, на которых работает Mono (включая Windows ). Вы получите значение счетчика, используя этот фрагмент кода:

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

Если вас интересует код на С, который предоставляет счетчик производительности, его можно найти здесь .

22 голосов
/ 05 декабря 2015

Все ответы здесь, включая принятый, дадут вам общий объем ОЗУ , доступный для использования. И это, возможно, было то, что хотел ОП.

Но если вы заинтересованы в получении суммы установленной оперативной памяти, то вы захотите вызвать функцию GetPhysicallyInstalledSystemMemory .

По ссылке, в разделе Замечания:

Функция GetPhysicallyInstalledSystemMemory извлекает объем физически установленной оперативной памяти из таблиц микропрограммного обеспечения компьютера SMBIOS. Это может отличаться от объема, сообщаемого функцией GlobalMemoryStatusEx , которая устанавливает для члена ullTotalPhys структуры MEMORYSTATUSEX объем физической памяти, доступной для используемой операционной системы. Объем памяти, доступный операционной системе, может быть меньше объема памяти, физически установленного на компьютере , поскольку BIOS и некоторые драйверы могут резервировать память в качестве областей ввода-вывода для памяти подключенные устройства, что делает память недоступной для операционной системы и приложений.

Пример кода:

[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.");
}
10 голосов
/ 25 июня 2014

Другой способ сделать это - использовать средства запросов .NET System.Management:

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;
6 голосов
/ 31 марта 2014

Вы можете просто использовать этот код для получения этой информации, просто добавьте ссылку

using Microsoft.VisualBasic.Devices;

и просто используйте следующий код

    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();
    }
4 голосов
/ 20 сентября 2008

Вы можете использовать WMI. Найден фрагмент.

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
3 голосов
/ 20 января 2016
// 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";
}
1 голос
/ 29 октября 2015

Эта функция (ManagementQuery) работает в Windows XP и более поздних версиях:

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;
}

Использование:

Console.WriteLine(BytesToMb(Convert.ToInt64(ManagementQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem", "TotalPhysicalMemory", "root\\CIMV2"))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...