【问题标题】:How to get the size of available system memory?如何获取可用系统内存的大小?
【发布时间】:2011-03-18 19:04:44
【问题描述】:

是否可以在 C#.NET 中获取系统可用内存的大小?如果是怎么办?

【问题讨论】:

    标签: c# .net memory diagnostics


    【解决方案1】:

    使用Microsoft.VisualBasic.Devices.ComputerInfo.TotalPhysicalMemory

    右键单击您的项目,添加引用,选择Microsoft.VisualBasic

    【讨论】:

    • 它是一个 .NET 框架类,在 2.0 以后的任何版本中都可用。命名空间名称无关紧要。
    • @JeffreyKevinPry - 这并不意味着你在做 VB.NET 或任何事情。它只是另一个有用的框架库,在这种情况下已经包含了适合使用的功能。它没有跨越任何 C# 纯粹主义路线;它只是利用了 .NET 的全部潜力。
    • 如果您不喜欢使用 VB 包装器,您可以包装它使用的相同本地方法:pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html
    • 我在 C# 和 .NET 4.5.2 上:new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory
    • 对于 C#,只需添加对 Microsoft.VisualBasic 项目的引用。然后,使用 Microsoft.VisualBasic.Devices 添加;到您将使用它的文件的顶部。然后,您可以将其用作 new ComputerInfo().AvailablePhysicalMemory。
    【解决方案2】:

    这个答案是基于 Hans Passant 的。所需的属性实际上是 AvailablePhysicalMemory。它(以及 TotalPhysicalMemory 和其他)是实例变量,所以它应该是

    new ComputerInfo().AvailablePhysicalMemory
    

    它在 C# 中工作,但我想知道为什么 this page 说对于 C#,“不支持这种语言或没有可用的代码示例。”

    【讨论】:

    • No- 因为它是 Visual Basic 中使用的 My 命名空间的一部分!不是 C#——包含这个 Visual Basic dll 将暴露这些在 VB.NET 中非常棒的快捷方式;在 VB 之后进入 C# 的人开始怀念这一点。不错的答案+1
    【解决方案3】:

    来自EggHeadCafe 在谷歌搜索“c# 系统内存”后

    您需要添加对 System.Management 的引用

    using System;
    using System.Management;
    
    namespace MemInfo
    {
        class Program
        {       
            static void Main(string[] args)
            {
                ObjectQuery winQuery = new ObjectQuery("SELECT * FROM Win32_LogicalMemoryConfiguration");
    
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(winQuery);
    
                foreach (ManagementObject item in searcher.Get())
                {
                    Console.WriteLine("Total Space = " + item["TotalPageFileSpace"]);
                    Console.WriteLine("Total Physical Memory = " + item["TotalPhysicalMemory"]);
                    Console.WriteLine("Total Virtual Memory = " + item["TotalVirtualMemory"]);
                    Console.WriteLine("Available Virtual Memory = " + item["AvailableVirtualMemory"]);
                }
                Console.Read();
            }
        }
    }
    

    输出:

    总空间 = 4033036

    总物理内存 = 2095172

    总虚拟内存 = 1933904

    可用虚拟内存 = 116280

    【讨论】:

    • Win32_LogicalMemoryConfiguration 从 Vista 开始不可用。替换为 CIM_OperatingSystem 并使用 TotalVisibleMemorySize、TotalVirtualMemorySize 等。上面的代码在 Win7 和 Vista 上都会抛出异常。
    • 继@Canacourse 的评论之后,请参阅:msdn.microsoft.com/en-us/library/aa387937(v=vs.85).aspx 了解有关 CIM_OperatingSystem 类的信息。
    【解决方案4】:
    var performance = new System.Diagnostics.PerformanceCounter("Memory", "Available MBytes");
    var memory = performance.NextValue();
    

    【讨论】:

    • 仅供参考,除非您明确授予权限,否则会发生“拒绝访问注册表项 'Global'”。
    【解决方案5】:

    使用可通过 System.Diagnostics 访问的性能计数器是一种选择。

    参考http://www.dotnetspider.com/resources/4612-Find-Memory-usage-CPU-usage.aspx

    希望这会有所帮助!

    【讨论】:

      【解决方案6】:

      一段代码:

       System.Diagnostics.PerformanceCounter ramCounter;     
       ramCounter = new System.Diagnostics.PerformanceCounter("Memory", "Available Bytes"); //"Available MBytes" for MB
       string getAvailableRAMInBytes = ramCounter.NextValue() + "byte";
      

      【讨论】:

        猜你喜欢
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 2020-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多