Как вы получаете общий объем оперативной памяти компьютера?

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

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

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

Update:

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

Ответ 1

Путь 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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Если вы используете 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);
   }
}

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

Ответ 5

Все ответы здесь, в том числе принятые, предоставят вам общий объем оперативной памяти для использования. И это, возможно, и требовало от OP.

Но если вы заинтересованы в получении объема установленной ОЗУ, то вам нужно сделать вызов функции 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.");
}

Ответ 6

Другой способ сделать это - использовать службы запросов .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;

Ответ 7

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

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

Ответ 8

Вы можете использовать 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

Ответ 9

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

Ответ 10

Эта функция (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"))));

Ответ 11

.NIT имеет ограничение на объем памяти, к которому он может получить доступ. Theres процент, а затем 2 ГБ в xp был жестким потолком.

У вас может быть 4 ГБ, и это убьет приложение, когда оно достигнет 2 ГБ.

Также в 64-битном режиме есть процент памяти, которую вы можете использовать вне системы, поэтому я не уверен, что вы можете запросить все это или если это специально защищено.

Ответ 12

Никто еще не упомянул GetPerformanceInfo. Подписи PInvoke доступны.

Эта функция делает доступной доступную для всей системы информацию:

  • CommitTotal
  • CommitLimit
  • CommitPeak
  • PhysicalTotal
  • PhysicalAvailable
  • SystemCache
  • KernelTotal
  • KernelPaged
  • KernelNonpaged
  • PageSize
  • HandleCount
  • ProcessCount
  • ThreadCount

PhysicalTotal - это то, что ищет OP, хотя значение - это количество страниц, поэтому для преобразования в байты умножьте на возвращаемое значение PageSize.

Ответ 13

/*The simplest way to get/display total physical memory in VB.net (Tested)

public sub get_total_physical_mem()

    dim total_physical_memory as integer

    total_physical_memory=CInt((My.Computer.Info.TotalPhysicalMemory) / (1024 * 1024))
    MsgBox("Total Physical Memory" + CInt((My.Computer.Info.TotalPhysicalMemory) / (1024 * 1024)).ToString + "Mb" )
end sub
*/


//The simplest way to get/display total physical memory in C# (converted Form http://www.developerfusion.com/tools/convert/vb-to-csharp)

public void get_total_physical_mem()
{
    int total_physical_memory = 0;

    total_physical_memory = Convert.ToInt32((My.Computer.Info.TotalPhysicalMemory) /  (1024 * 1024));
    Interaction.MsgBox("Total Physical Memory" + Convert.ToInt32((My.Computer.Info.TotalPhysicalMemory) / (1024 * 1024)).ToString() + "Mb");
}