En utilisant C #, je souhaite obtenir la quantité totale de RAM dont dispose mon ordinateur. Avec le PerformanceCounter, je peux obtenir la quantité de RAM disponible, en définissant:
counter.CategoryName = "Memory";
counter.Countername = "Available MBytes";
Mais je n'arrive pas à trouver un moyen d'obtenir la quantité totale de mémoire. Comment pourrais-je procéder?
Mise à jour:
MagicKat: J'ai vu ça quand je cherchais, mais ça ne marche pas - "Vous manquez un assemblage ou une référence?". J'ai cherché à ajouter cela aux références, mais je ne le vois pas.
this.dwLength = (uint)Marshal.SizeOf(this);
et cela fonctionne de la même manière (j'ai eu des problèmes avec l'utilisation de NativeMethods donc ce correctif fonctionne maintenant).Ajoutez une référence à
Microsoft.VisualBasic
et ausing Microsoft.VisualBasic.Devices;
.La
ComputerInfo
classe a toutes les informations dont vous avez besoin.la source
Ajoutez une référence à Microsoft.VisualBasic.dll, comme mentionné ci-dessus. Ensuite, obtenir la mémoire physique totale est aussi simple que cela (oui, je l'ai testé):
static ulong GetTotalMemoryInBytes() { return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory; }
la source
Toutes les réponses ici, y compris celle acceptée, vous donneront la quantité totale de RAM disponible . Et c'est peut-être ce que voulait OP.
Mais si vous souhaitez obtenir la quantité de RAM installée , vous voudrez passer un appel au GetPhysicallyInstalledSystemMemory fonction .
À partir du lien, dans la section Remarques:
Exemple de code:
[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."); }
la source
Si vous utilisez Mono, vous serez peut-être intéressé de savoir que Mono 2.8 (qui sortira plus tard cette année) aura un compteur de performances qui indique la taille de la mémoire physique sur toutes les plates-formes sur lesquelles Mono fonctionne (y compris Windows). Vous récupéreriez la valeur du compteur à l'aide de cet extrait de code:
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); } }
Si vous êtes intéressé par le code C qui fournit le compteur de performance, il peut être trouvé ici .
la source
Une autre façon de procéder consiste à utiliser les fonctionnalités d'interrogation .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;
la source
Microsoft.VisualBasic.Devices
. Et comme one-linervar Capacity = new ManagementObjectSearcher("SELECT Capacity FROM Win32_PhysicalMemory").Get().Cast<ManagementObject>().Sum(x => Convert.ToInt64(x.Properties["Capacity"].Value));
Pour ceux qui utilisent,
.net Core 3.0
il n'est pas nécessaire d'utiliser laPInvoke
plate-forme pour obtenir la mémoire physique disponible. LaGC
classe a ajouté une nouvelle méthodeGC.GetGCMemoryInfo
qui renvoie unGCMemoryInfo Struct
withTotalAvailableMemoryBytes
comme propriété. Cette propriété renvoie la mémoire totale disponible pour le garbage collector. (Même valeur que MEMORYSTATUSEX)var gcMemoryInfo = GC.GetGCMemoryInfo(); installedMemory = gcMemoryInfo.TotalAvailableMemoryBytes; // it will give the size of memory in MB var physicalMemory = (double) installedMemory / 1048576.0;
la source
vous pouvez simplement utiliser ce code pour obtenir ces informations, ajoutez simplement la référence
using Microsoft.VisualBasic.Devices;
et utilisez simplement le code suivant
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(); }
la source
// 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"; }
la source
Vous pouvez utiliser WMI. Vous avez trouvé un extrait.
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
la source
Set
n'est plus nécessaire pour VB.NET, est-ce le code VB6?Cette fonction (
ManagementQuery
) fonctionne sur Windows XP et versions ultérieures: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; }
Usage:
Console.WriteLine(BytesToMb(Convert.ToInt64(ManagementQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem", "TotalPhysicalMemory", "root\\CIMV2"))));
la source
BytesToMb
fonction?Compatible avec .Net et Mono (testé avec Win10 / FreeBSD / CentOS)
Utilisation
ComputerInfo
du code source et desPerformanceCounter
s pour Mono et comme sauvegarde pour .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))) }; } } }
la source
Personne n'a encore mentionné GetPerformanceInfo . Les signatures PInvoke sont disponibles.
Cette fonction rend disponibles les informations suivantes à l'échelle du système:
PhysicalTotal
est ce que l'OP recherche, bien que la valeur soit le nombre de pages, donc pour convertir en octets, multipliez par laPageSize
valeur retournée.la source
.NIT a une limite à la quantité de mémoire à laquelle il peut accéder par rapport au total. Theres un pourcentage, puis 2 Go en xp était le plafond dur.
Vous pourriez avoir 4 Go dedans, et cela tuerait l'application quand elle atteindrait 2 Go.
Toujours en mode 64 bits, il y a un pourcentage de mémoire que vous pouvez utiliser hors du système, donc je ne suis pas sûr si vous pouvez demander le tout ou si cela est spécifiquement protégé.
la source
/*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"); }
la source