Как вы получаете общий объем оперативной памяти компьютера?
Используя С#, я хочу получить общий объем ОЗУ, который имеет мой компьютер.
С 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");
}