[c#] 컴퓨터에있는 총 RAM 양은 어떻게 얻습니까?

C #을 사용하여 내 컴퓨터에있는 총 RAM 양을 얻고 싶습니다. PerformanceCounter를 사용하면 다음을 설정하여 사용 가능한 램의 양을 얻을 수 있습니다.

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

그러나 총 메모리 양을 얻는 방법을 찾지 못하는 것 같습니다. 어떻게하면 되나요?

최신 정보:

MagicKat : 검색 할 때 봤는데 작동하지 않습니다. “어셈블리 또는 참조가 누락 되었습니까?”. 나는 그것을 References에 추가하려고했지만 거기에는 보이지 않습니다.



답변

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클래스 에서 쿼리 할 수 ​​있습니다 .


답변

Microsoft.VisualBasic및에 대한 참조를 추가합니다 using Microsoft.VisualBasic.Devices;.

ComputerInfo클래스는 당신이 필요로하는 모든 정보가 있습니다.


답변

위에서 언급 한 것처럼 Microsoft.VisualBasic.dll에 대한 참조를 추가합니다. 그런 다음 총 물리적 메모리를 얻는 것은 다음과 같이 간단합니다 (예, 테스트했습니다).

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


답변

허용되는 답변을 포함하여 여기에있는 모든 답변 은 사용 가능한 총 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.");
}


답변

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 코드에 관심이있는 경우 여기 에서 찾을 수 있습니다 .


답변

이를 수행하는 또 다른 방법은 .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;


답변

사용하는 사람들은 사용 가능한 물리적 메모리를 얻기 위해 플랫폼 .net Core 3.0을 사용할 필요가 없습니다 PInvoke. GC클래스는 새로운 방법을 추가했습니다 GC.GetGCMemoryInfo다시 발생 GCMemoryInfo StructTotalAvailableMemoryBytes속성으로합니다. 이 속성은 가비지 수집기에 사용할 수있는 총 메모리를 반환합니다 (MEMORYSTATUSEX와 동일한 값).

var gcMemoryInfo = GC.GetGCMemoryInfo();
installedMemory = gcMemoryInfo.TotalAvailableMemoryBytes;
// it will give the size of memory in MB
var physicalMemory = (double) installedMemory / 1048576.0;