Usando C #, desejo obter a quantidade total de RAM que meu computador possui. Com o PerformanceCounter posso obter a quantidade de RAM disponível, configurando:
counter.CategoryName = "Memory";
counter.Countername = "Available MBytes";
Mas não consigo encontrar uma maneira de obter a quantidade total de memória. Como eu faria isso?
Atualizar:
MagicKat: Eu vi isso quando estava procurando, mas não funciona - "Você está faltando um assembly ou referência?". Procurei adicionar isso às referências, mas não o vejo lá.
c#
memory
performancecounter
Joel
fonte
fonte
this.dwLength = (uint)Marshal.SizeOf(this);
e funciona da mesma forma (tive problemas com o uso de NativeMethods, então esta correção agora funciona).Adicione uma referência a
Microsoft.VisualBasic
e ausing Microsoft.VisualBasic.Devices;
.A
ComputerInfo
aula tem todas as informações de que você precisa.fonte
Adicione uma referência a Microsoft.VisualBasic.dll, como alguém mencionado acima. Então, obter memória física total é tão simples quanto isto (sim, eu testei):
static ulong GetTotalMemoryInBytes() { return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory; }
fonte
Todas as respostas aqui, incluindo a aceita, fornecerão a quantidade total de RAM disponível para uso. E pode ter sido isso que a OP queria.
Mas se você estiver interessado em obter a quantidade de RAM instalada , convém fazer uma chamada para a função GetPhysicallyInstalledSystemMemory .
A partir do link, na seção Comentários:
Código de amostra:
[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."); }
fonte
Se você estiver usando o Mono, talvez se interesse em saber que o Mono 2.8 (a ser lançado ainda este ano) terá um contador de desempenho que relata o tamanho da memória física em todas as plataformas em que o Mono é executado (incluindo Windows). Você recuperaria o valor do contador usando este snippet de código:
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); } }
Se você estiver interessado no código C que fornece o contador de desempenho, ele pode ser encontrado aqui .
fonte
Outra maneira de fazer isso é usando os recursos de consulta .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;
fonte
Microsoft.VisualBasic.Devices
. E como uma linhavar Capacity = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory").Get().Cast<ManagementObject>().Sum(x => Convert.ToInt64(x.Properties["Capacity"].Value));
Para quem está usando,
.net Core 3.0
não há necessidade de usarPInvoke
plataforma para obter a memória física disponível. AGC
classe adicionou um novo métodoGC.GetGCMemoryInfo
que retorna umGCMemoryInfo Struct
withTotalAvailableMemoryBytes
como uma propriedade. Esta propriedade retorna a memória total disponível para o coletor de lixo. (Mesmo valor de MEMORYSTATUSEX)var gcMemoryInfo = GC.GetGCMemoryInfo(); installedMemory = gcMemoryInfo.TotalAvailableMemoryBytes; // it will give the size of memory in MB var physicalMemory = (double) installedMemory / 1048576.0;
fonte
você pode simplesmente usar este código para obter essas informações, basta adicionar a referência
using Microsoft.VisualBasic.Devices;
e simplesmente usar o seguinte código
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(); }
fonte
// 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"; }
fonte
Você pode usar o WMI. Encontrou um fragmento.
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
fonte
Set
não é mais necessário para VB.NET, este é o código VB6?Esta função (
ManagementQuery
) funciona no Windows XP e posterior: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; }
Uso:
Console.WriteLine(BytesToMb(Convert.ToInt64(ManagementQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem", "TotalPhysicalMemory", "root\\CIMV2"))));
fonte
BytesToMb
função?Compatível com .Net e Mono (testado com Win10 / FreeBSD / CentOS)
Usando
ComputerInfo
código-fontePerformanceCounter
es para Mono e como backup para .Net:using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Security; public class SystemMemoryInfo { private readonly PerformanceCounter _monoAvailableMemoryCounter; private readonly PerformanceCounter _monoTotalMemoryCounter; private readonly PerformanceCounter _netAvailableMemoryCounter; private ulong _availablePhysicalMemory; private ulong _totalPhysicalMemory; public SystemMemoryInfo() { try { if (PerformanceCounterCategory.Exists("Mono Memory")) { _monoAvailableMemoryCounter = new PerformanceCounter("Mono Memory", "Available Physical Memory"); _monoTotalMemoryCounter = new PerformanceCounter("Mono Memory", "Total Physical Memory"); } else if (PerformanceCounterCategory.Exists("Memory")) { _netAvailableMemoryCounter = new PerformanceCounter("Memory", "Available Bytes"); } } catch { // ignored } } public ulong AvailablePhysicalMemory { [SecurityCritical] get { Refresh(); return _availablePhysicalMemory; } } public ulong TotalPhysicalMemory { [SecurityCritical] get { Refresh(); return _totalPhysicalMemory; } } [SecurityCritical] [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)] private static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer); [SecurityCritical] [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); [SecurityCritical] private void Refresh() { try { if (_monoTotalMemoryCounter != null && _monoAvailableMemoryCounter != null) { _totalPhysicalMemory = (ulong) _monoTotalMemoryCounter.NextValue(); _availablePhysicalMemory = (ulong) _monoAvailableMemoryCounter.NextValue(); } else if (Environment.OSVersion.Version.Major < 5) { var memoryStatus = MEMORYSTATUS.Init(); GlobalMemoryStatus(ref memoryStatus); if (memoryStatus.dwTotalPhys > 0) { _availablePhysicalMemory = memoryStatus.dwAvailPhys; _totalPhysicalMemory = memoryStatus.dwTotalPhys; } else if (_netAvailableMemoryCounter != null) { _availablePhysicalMemory = (ulong) _netAvailableMemoryCounter.NextValue(); } } else { var memoryStatusEx = MEMORYSTATUSEX.Init(); if (GlobalMemoryStatusEx(ref memoryStatusEx)) { _availablePhysicalMemory = memoryStatusEx.ullAvailPhys; _totalPhysicalMemory = memoryStatusEx.ullTotalPhys; } else if (_netAvailableMemoryCounter != null) { _availablePhysicalMemory = (ulong) _netAvailableMemoryCounter.NextValue(); } } } catch { // ignored } } private struct MEMORYSTATUS { private uint dwLength; internal uint dwMemoryLoad; internal uint dwTotalPhys; internal uint dwAvailPhys; internal uint dwTotalPageFile; internal uint dwAvailPageFile; internal uint dwTotalVirtual; internal uint dwAvailVirtual; public static MEMORYSTATUS Init() { return new MEMORYSTATUS { dwLength = checked((uint) Marshal.SizeOf(typeof(MEMORYSTATUS))) }; } } private struct MEMORYSTATUSEX { private uint dwLength; internal uint dwMemoryLoad; internal ulong ullTotalPhys; internal ulong ullAvailPhys; internal ulong ullTotalPageFile; internal ulong ullAvailPageFile; internal ulong ullTotalVirtual; internal ulong ullAvailVirtual; internal ulong ullAvailExtendedVirtual; public static MEMORYSTATUSEX Init() { return new MEMORYSTATUSEX { dwLength = checked((uint) Marshal.SizeOf(typeof(MEMORYSTATUSEX))) }; } } }
fonte
Ninguém mencionou GetPerformanceInfo ainda. As assinaturas do PInvoke estão disponíveis.
Esta função disponibiliza as seguintes informações de todo o sistema:
PhysicalTotal
é o que o OP está procurando, embora o valor seja o número de páginas, portanto, para converter em bytes, multiplique peloPageSize
valor retornado.fonte
.NIT tem um limite para a quantidade de memória que pode acessar do total. Há uma porcentagem e 2 GB no xp era o limite máximo.
Você poderia ter 4 GB nele e mataria o aplicativo quando atingisse 2 GB.
Também no modo de 64 bits, há uma porcentagem de memória que você pode usar fora do sistema, então não tenho certeza se você pode pedir tudo ou se isso é especificamente protegido.
fonte
/*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"); }
fonte