我们如何获得计算机具有的RAM总量?

时间:2020-03-06 14:27:37  来源:igfitidea点击:

使用C#,我想获取计算机拥有的RAM总量。
使用PerformanceCounter,我可以通过设置以下内容来获得可用内存的数量:

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

但是我似乎找不到找到总内存量的方法。我将如何去做呢?

更新:

MagicKat:我在搜索时看到了,但是"我们是否缺少程序集或者参考?"不起作用。我曾试图将其添加到参考中,但在那里看不到它。

解决方案

.NIT对它可以访问的总内存量有限制。有一个百分比,然后xp中的2 GB是硬上限。

我们可能有4 GB,当它达到2GB时它将杀死该应用程序。

同样在64位模式下,我们可以在系统外部使用一定百分比的内存,因此我不确定是否可以要求全部内容或者是否需要特别注意。

添加对" Microsoft.VisualBasic"和" using Microsoft.VisualBasic.Devices;"的引用。

ComputerInfo类具有我们需要的所有信息。

我们可以使用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

p /调用方式EDIT:更改为GlobalMemoryStatusEx以提供准确的结果(heh)

[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(受管但速度较慢)在" Win32_ComputerSystem"类中查询" TotalPhysicalMemory"。

根据joel-llamaduck.blogspot.com的注释编辑固定代码

如上所述,添加对Microsoft.VisualBasic.dll的引用。然后,获取全部物理内存就这么简单(是的,我已经对其进行了测试):

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

如果我们恰好使用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代码感兴趣,可以在这里找到。