Za pomocą języka C # chcę uzyskać całkowitą ilość pamięci RAM, którą ma mój komputer. Dzięki PerformanceCounter mogę uzyskać ilość dostępnej pamięci RAM, ustawiając:
counter.CategoryName = "Memory";
counter.Countername = "Available MBytes";
Ale nie mogę znaleźć sposobu, aby uzyskać całkowitą ilość pamięci. Jak bym to zrobił?
Aktualizacja:
MagicKat: Widziałem to, kiedy szukałem, ale to nie działa - „Brakuje Ci zestawu lub referencji?”. Chciałem dodać to do odniesień, ale nie widzę tego tam.
c#
memory
performancecounter
Joel
źródło
źródło
this.dwLength = (uint)Marshal.SizeOf(this);
i działa tak samo (miałem problem z używaniem NativeMethods, więc ta poprawka teraz działa).Dodaj odniesienie do
Microsoft.VisualBasic
iusing Microsoft.VisualBasic.Devices;
.ComputerInfo
Klasa posiada wszystkie informacje, które potrzebujesz.źródło
Dodaj odwołanie do Microsoft.VisualBasic.dll, jak ktoś wspomniany powyżej. Uzyskanie całkowitej pamięci fizycznej jest tak proste (tak, testowałem to):
static ulong GetTotalMemoryInBytes() { return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory; }
źródło
Wszystkie odpowiedzi tutaj, w tym zaakceptowana, podają całkowitą ilość dostępnej pamięci RAM . I być może tego chciał OP.
Ale jeśli jesteś zainteresowany uzyskaniem ilości zainstalowanej pamięci RAM, będziesz chciał wykonać wywołanie funkcji GetPhysicallyInstalledSystemMemory .
Z linku w sekcji Uwagi:
Przykładowy kod:
[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."); }
źródło
Jeśli używasz Mono, możesz być zainteresowany, aby wiedzieć, że Mono 2.8 (który zostanie wydany jeszcze w tym roku) będzie miał licznik wydajności, który zgłasza rozmiar pamięci fizycznej na wszystkich platformach, na których działa Mono (w tym Windows). Wartość licznika można pobrać za pomocą tego fragmentu kodu:
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); } }
Jeśli jesteś zainteresowany kodem C, który zapewnia licznik wydajności, możesz go znaleźć tutaj .
źródło
Innym sposobem, aby to zrobić, jest użycie narzędzi do wykonywania zapytań .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;
źródło
Microsoft.VisualBasic.Devices
. I jako jedna linijkavar Capacity = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory").Get().Cast<ManagementObject>().Sum(x => Convert.ToInt64(x.Properties["Capacity"].Value));
Dla tych, którzy korzystają,
.net Core 3.0
nie ma potrzeby korzystania zPInvoke
platformy w celu uzyskania dostępnej pamięci fizycznej.GC
Klasa wprowadził nową metodęGC.GetGCMemoryInfo
, która zwracaGCMemoryInfo Struct
sięTotalAvailableMemoryBytes
w postaci nieruchomości. Ta właściwość zwraca całkowitą dostępną pamięć dla modułu odśmiecania pamięci. (Ta sama wartość co MEMORYSTATUSEX)var gcMemoryInfo = GC.GetGCMemoryInfo(); installedMemory = gcMemoryInfo.TotalAvailableMemoryBytes; // it will give the size of memory in MB var physicalMemory = (double) installedMemory / 1048576.0;
źródło
możesz po prostu użyć tego kodu, aby uzyskać te informacje, po prostu dodaj odniesienie
using Microsoft.VisualBasic.Devices;
a po prostu użyj następującego kodu
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(); }
źródło
// 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"; }
źródło
Możesz użyć WMI. Znalazłem fragment.
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
źródło
Set
nie jest już potrzebny dla VB.NET, czy to jest kod VB6?Ta funkcja (
ManagementQuery
) działa w systemie Windows XP i nowszych: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; }
Stosowanie:
Console.WriteLine(BytesToMb(Convert.ToInt64(ManagementQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem", "TotalPhysicalMemory", "root\\CIMV2"))));
źródło
BytesToMb
pochodzi ta funkcja?Kompatybilny z .Net i Mono (testowany z Win10 / FreeBSD / CentOS)
Używanie
ComputerInfo
kodu źródłowego isPerformanceCounter
dla Mono i jako kopia zapasowa dla .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))) }; } } }
źródło
Nikt jeszcze nie wspomniał o GetPerformanceInfo . Podpisy PInvoke są dostępne.
Ta funkcja udostępnia następujące informacje o całym systemie:
PhysicalTotal
jest tym, czego szuka OP, chociaż wartością jest liczba stron, więc aby przekonwertować na bajty, należy pomnożyć przezPageSize
zwróconą wartość.źródło
.NIT ma ograniczenie łącznej ilości pamięci, do której może uzyskać dostęp. Jest procent, a następnie 2 GB w xp to twardy sufit.
Możesz mieć w nim 4 GB i zabije aplikację, gdy osiągnie 2 GB.
Również w trybie 64-bitowym istnieje procent pamięci, którego możesz użyć poza systemem, więc nie jestem pewien, czy możesz poprosić o całość, czy też jest to specjalnie chronione.
źródło
/*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"); }
źródło