当前位置:  开发笔记 > 编程语言 > 正文

你如何获得计算机的RAM总量?

如何解决《你如何获得计算机的RAM总量?》经验,为你挑选了7个好方法。

使用C#,我想获得我的计算机拥有的RAM总量.使用PerformanceCounter,我可以通过设置获得可用ram的数量:

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

但我似乎无法找到获得总内存量的方法.我该怎么做呢?

更新:

MagicKat:我在搜索时看到了它,但它不起作用 - "你错过了一个装配或参考吗?".我希望将它添加到参考文献中,但我没有在那里看到它.



1> MagicKat..:

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

ComputerInfo课程包含您需要的所有信息.


+1:有些人厌恶从C#引用Microsoft.VisualBasic命名空间,尽管它实际上只是作为其他一部分安装的另一个程序集.
为什么这个被投了票呢?投票回来了!这是最简单的方法,是的,你可以从C#中做到这一点.
对于任何对使用(新的ComputerInfo()).TotalPhysicalMemory的怀疑,它在具有更多内存的系统上工作正常.它的返回类型是无符号长整数,因此如果没有(无效)强制转换,则无法使用负数.
var totalGBRam = Convert.ToInt32((new ComputerInfo().TotalPhysicalMemory /(Math.Pow(1024,3)))+ 0.5);

2> Philip Rieck..:

p/invoke方式编辑:更改为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(托管但速度较慢)来查询"Win32_ComputerSystem"类中的"TotalPhysicalMemory".

从joel-llamaduck.blogspot.com 编辑每条评论的固定代码


代码有效,只有你不需要使用'NativeMethods'来获得对象的大小,你可以这样说:`this.dwLength =(uint)Marshal.SizeOf(this);`和它的工作方式相同(我在使用NativeMethods时遇到了麻烦,所以现在这个修复工作正常.

3> Ryan Lundy..:

像上面提到的那样添加对Microsoft.VisualBasic.dll的引用.然后获得总物理内存就像这样简单(是的,我测试过它):

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


@ppumkin,在什么版本的.NET中,以及在什么版本的Visual Studio中?当我在具有8 GB RAM的64位计算机上使用.NET 4.5在VS 2012中运行它时,它运行正常.我回来了8520327168.

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> sstan..:

这里的所有答案,包括已接受的答案,都将为您提供可用的RAM总量.这可能是OP想要的.

但是,如果您对获取已安装的 RAM 数量感兴趣,那么您将需要调用GetPhysicallyInstalledSystemMemory函数.

从链接中,在备注部分:

GetPhysicallyInstalledSystemMemory功能从计算机的SMBIOS固件表中检索物理安装的RAM量.这可能与GlobalMemoryStatusEx函数报告的数量不同,后者将MEMORYSTATUSEX结构的ullTotalPhys成员设置为可供操作系统使用的物理内存量.操作系统可用的内存量可能小于计算机中物理安装的内存量,因为BIOS和某些驱动程序可能会将内存保留为内存映射设备的I/O区域,从而使操作系统无法访问内存和应用程序.

示例代码:

[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> zgerd..:

另一种方法是使用.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();
    }

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有