91

C# を使用して、コンピューターに搭載されている RAM の総量を取得したいと考えています。PerformanceCounter を使用すると、次のように設定して、使用可能な RAM の量を取得できます。

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

しかし、メモリの総量を取得する方法が見つからないようです。どうすればこれを行うことができますか?

アップデート:

MagicKat: 検索中に見たのですが、機能しません - 「アセンブリまたは参照がありませんか?」。それを参照に追加しようとしましたが、そこにはありません。

4

16 に答える 16

184

Microsoft.VisualBasicとへの参照を追加しますusing Microsoft.VisualBasic.Devices;

クラスには、ComputerInfo必要なすべての情報が含まれています。

于 2008-09-19T20:06:28.230 に答える
64

Windows API関数GlobalMemoryStatusExは、p/invokeを使用して呼び出すことができます。

  [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(管理対象ですが低速)を使用TotalPhysicalMemoryしてWin32_ComputerSystemクラスでクエリを実行できます。

于 2008-09-19T20:09:00.313 に答える
64

上で述べたように、Microsoft.VisualBasic.dll への参照を追加します。次に、物理メモリの合計を取得するのは次のように簡単です (はい、テストしました)。

static ulong GetTotalMemoryInBytes()
{
    return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;
}
于 2008-09-19T21:43:59.900 に答える
39

受け入れられたものを含め、ここでのすべての回答は、使用可能なRAM の合計量を示します。そして、それがOPが望んでいたものだったのかもしれません。

ただし、インストールされている RAMの量を取得することに関心がある場合は、 GetPhysicallyInstalledSystemMemory関数を呼び出す必要があります。

リンクから、備考セクションで:

GetPhysicallyInstalledSystemMemory関数は、コンピューターの SMBIOS ファームウェア テーブルから物理的にインストールされている RAM の量を取得します。これは、MEMORYSTATUSEX 構造体の ullTotalPhys メンバーを、オペレーティング システムが使用できる物理メモリの量に設定するGlobalMemoryStatusEx関数によって報告される量とは異なる場合があります。オペレーティング システムで使用できるメモリの量は、コンピューターに物理的にインストールされているメモリの量よりも少なくなる可能性があります。これは、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.");
}
于 2015-12-05T03:29:34.270 に答える
31

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 コードに興味がある場合は、ここで見つけることができます。

于 2010-04-16T17:34:54.977 に答える
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();
    }
于 2014-03-31T04:49:36.327 に答える
5

'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
于 2008-09-19T20:08:27.227 に答える
5
// 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";
}
于 2016-01-20T12:28:35.380 に答える
2

この関数 ( ManagementQuery) は、Windows XP 以降で動作します。

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;
}

使用法:

Console.WriteLine(BytesToMb(Convert.ToInt64(ManagementQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem", "TotalPhysicalMemory", "root\\CIMV2"))));
于 2015-10-29T11:41:24.570 に答える
0

.NET には、アクセスできるメモリ量の制限があります。Windows XP では、2GB は「ハード シーリング」でした。例: 4 GB を入れることができ、2GB に達するとアプリが強制終了されます。

また、64ビットモードでは、システム外で使用できるメモリの割合があるため、すべてを要求できるかどうか、またはこれが特に保護されているかどうかはわかりません.

于 2008-09-19T20:03:02.263 に答える
-3
/*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");
}
于 2012-05-05T13:57:14.880 に答える
-3

var ram = new ManagementObjectSearcher("select * from Win32_PhysicalMemory") .Get().Cast<ManagementObject>().First();

| |

var a = Convert.ToInt64(ram["Capacity"]) / 1024 / 1024 / 1024;

(richiede System.Managment.dll は、フレームワーク 4.7.2 で C# を使用してテストされます)

questa procedura salva in "a" la ram totale presente in GB


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

| |

var b = Convert.ToDecimal(memory()) / 1024 / 1024 / 1024;

(richiede Microsoft.VisualBasics.dll は、C# Framework 4.7.2 でテストされ、リフェリメントされます)

GB effettivamente disponibile の "b" il valore della ram の questa procedura salva


于 2021-03-25T17:01:54.080 に答える