it-swarm-tr.com

Toplam tutarı nasıl alıyorsunuz RAM bilgisayar var mı?

C # kullanarak, bilgisayarımın sahip olduğu toplam RAM tutarını almak istiyorum .. __ PerformanceCounter ile Ayarlayarak Kullanılabilir ram miktarını alabilirim:

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

Ancak toplam bellek miktarını almanın bir yolunu bulamıyorum. Bunu nasıl yapacağım?

Güncelleme:

MagicKat: Ararken gördüm ama işe yaramadı - "Bir Meclis veya referansı mı kaçırıyorsunuz?" Bunu Referanslara eklemek için baktım ama orada göremiyorum.

67
Joel

P/invoke yoluEDIT: GlobalMemoryStatusEx ile doğru sonuçlar elde etmek için değiştirildi (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);

Sonra gibi kullanın:

ulong installedMemory;
MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX();
if( GlobalMemoryStatusEx( memStatus))
{ 
   installedMemory = memStatus.ullTotalPhys;
}

Veya "Win32_ComputerSystem" sınıfındaki "TotalPhysicalMemory" yi sorgulamak için WMI (yönetilen ancak daha yavaş) kullanabilirsiniz.

Düzenle joel-llamaduck.blogspot.com adresinden yorum başına sabit kod

54
Philip Rieck

Microsoft.VisualBasic ve bir using Microsoft.VisualBasic.Devices; dosyasına bir referans ekleyin.

ComputerInfo sınıfı ihtiyacınız olan tüm bilgilere sahiptir. 

167
MagicKat

Yukarıda da belirtildiği gibi Microsoft.VisualBasic.dll dosyasına bir başvuru ekleyin. O zaman toplam fiziksel hafıza almak bu kadar basittir (evet, test ettim):

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

Mono kullanıyorsanız, Mono 2.8'in (bu yılın sonunda piyasaya sürülecektir) Mono'nun çalıştığı tüm platformlarda (Windows dahil) fiziksel bellek boyutunu rapor eden bir performans sayacı olacağını bilmek isteyebilirsiniz. Bu kod snippet'ini kullanarak sayacın değerini alırsınız:

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

Performans sayacını sağlayan C koduyla ilgileniyorsanız, here dizininde bulunabilir.

29
grendel

Buradaki tüm cevaplar, kabul edilenler de dahil, size kullanım için toplam RAM kullanılabilir tutarını verecektir. Ve OP'nin istediği şey bu olabilir.

Ancak, yüklü RAM tutarını almak istiyorsanız, GetPhysicallyInstalledSystemMemory işlevine bir çağrı yapmak istersiniz.

Bağlantıdan, Açıklamalar bölümünde:

GetPhysicallyInstalledSystemMemory işlevi, bilgisayarın SMBIOS üretici yazılımı tablolarından fiziksel olarak yüklenen RAM miktarını alır. Bu, MEMORYSTATUSEX yapısının ullTotalPhys üyesini işletim sisteminin kullanabileceği fiziksel bellek miktarına ayarlayan GlobalMemoryStatusEx işlevi tarafından bildirilen miktardan farklı olabilir. İşletim sistemi tarafından kullanılabilen bellek miktarı, bilgisayara fiziksel olarak takılan bellek miktarından daha az olabilir çünkü BIOS ve bazı sürücüler bellek eşleştirmesi için G/Ç bölgeleri olarak bellek ayırabilir aygıtları, belleği işletim sistemi ve uygulamalar için kullanılamaz duruma getirir.

Basit kod:

[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.");
}
19
sstan

Bunu yapmanın başka bir yolu da .NET System.Management sorgulama olanaklarını kullanmaktır:

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;
10
zgerd

bu bilgileri almak için bu kodu kullanabilirsiniz, sadece başvuru ekleyin 

using Microsoft.VisualBasic.Devices;

ve sadece aşağıdaki kodu kullanın 

    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();
    }
6
Nilan Niyomal

WMI kullanabilirsiniz. Bir parça bulundu.

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
4
CodeRot
// 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";
}
3
Mehul Sant

Bu işlev (ManagementQuery) Windows XP ve sonraki sürümlerinde çalışır:

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

Kullanımı:

Console.WriteLine(BytesToMb(Convert.ToInt64(ManagementQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem", "TotalPhysicalMemory", "root\\CIMV2"))));
1
Lance

.NIT, toplamın erişebileceği bellek miktarına sınırlıdır. Yüzde Theres, ve sonra xp 2 GB sert tavan oldu.

İçinde 4 GB olabilir ve 2 GB'a ulaştığında uygulamayı öldürür.

Ayrıca 64 bit modunda, sistemden kullanabileceğiniz bir bellek yüzdesi vardır, bu yüzden her şeyi isteyip istemediğinize veya bunun özellikle karşı korumalı olup olmadığından emin değilim.

0
DevelopingChris

Net ve Mono ile uyumlu (Win10/FreeBSD/CentOS ile test edilmiştir)

Mono için ComputerInfo kaynak kodu ve PerformanceCounters ve .Net için yedekleme olarak:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security;

public class SystemMemoryInfo
{
    private readonly PerformanceCounter _monoAvailableMemoryCounter;
    private readonly PerformanceCounter _monoTotalMemoryCounter;
    private readonly PerformanceCounter _netAvailableMemoryCounter;

    private ulong _availablePhysicalMemory;
    private ulong _totalPhysicalMemory;

    public SystemMemoryInfo()
    {
        try
        {
            if (PerformanceCounterCategory.Exists("Mono Memory"))
            {
                _monoAvailableMemoryCounter = new PerformanceCounter("Mono Memory", "Available Physical Memory");
                _monoTotalMemoryCounter = new PerformanceCounter("Mono Memory", "Total Physical Memory");
            }
            else if (PerformanceCounterCategory.Exists("Memory"))
            {
                _netAvailableMemoryCounter = new PerformanceCounter("Memory", "Available Bytes");
            }
        }
        catch
        {
            // ignored
        }
    }

    public ulong AvailablePhysicalMemory
    {
        [SecurityCritical]
        get
        {
            Refresh();

            return _availablePhysicalMemory;
        }
    }

    public ulong TotalPhysicalMemory
    {
        [SecurityCritical]
        get
        {
            Refresh();

            return _totalPhysicalMemory;
        }
    }

    [SecurityCritical]
    [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);

    [SecurityCritical]
    [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);

    [SecurityCritical]
    private void Refresh()
    {
        try
        {
            if (_monoTotalMemoryCounter != null && _monoAvailableMemoryCounter != null)
            {
                _totalPhysicalMemory = (ulong) _monoTotalMemoryCounter.NextValue();
                _availablePhysicalMemory = (ulong) _monoAvailableMemoryCounter.NextValue();
            }
            else if (Environment.OSVersion.Version.Major < 5)
            {
                var memoryStatus = MEMORYSTATUS.Init();
                GlobalMemoryStatus(ref memoryStatus);

                if (memoryStatus.dwTotalPhys > 0)
                {
                    _availablePhysicalMemory = memoryStatus.dwAvailPhys;
                    _totalPhysicalMemory = memoryStatus.dwTotalPhys;
                }
                else if (_netAvailableMemoryCounter != null)
                {
                    _availablePhysicalMemory = (ulong) _netAvailableMemoryCounter.NextValue();
                }
            }
            else
            {
                var memoryStatusEx = MEMORYSTATUSEX.Init();

                if (GlobalMemoryStatusEx(ref memoryStatusEx))
                {
                    _availablePhysicalMemory = memoryStatusEx.ullAvailPhys;
                    _totalPhysicalMemory = memoryStatusEx.ullTotalPhys;
                }
                else if (_netAvailableMemoryCounter != null)
                {
                    _availablePhysicalMemory = (ulong) _netAvailableMemoryCounter.NextValue();
                }
            }
        }
        catch
        {
            // ignored
        }
    }

    private struct MEMORYSTATUS
    {
        private uint dwLength;
        internal uint dwMemoryLoad;
        internal uint dwTotalPhys;
        internal uint dwAvailPhys;
        internal uint dwTotalPageFile;
        internal uint dwAvailPageFile;
        internal uint dwTotalVirtual;
        internal uint dwAvailVirtual;

        public static MEMORYSTATUS Init()
        {
            return new MEMORYSTATUS
            {
                dwLength = checked((uint) Marshal.SizeOf(typeof(MEMORYSTATUS)))
            };
        }
    }

    private struct MEMORYSTATUSEX
    {
        private uint dwLength;
        internal uint dwMemoryLoad;
        internal ulong ullTotalPhys;
        internal ulong ullAvailPhys;
        internal ulong ullTotalPageFile;
        internal ulong ullAvailPageFile;
        internal ulong ullTotalVirtual;
        internal ulong ullAvailVirtual;
        internal ulong ullAvailExtendedVirtual;

        public static MEMORYSTATUSEX Init()
        {
            return new MEMORYSTATUSEX
            {
                dwLength = checked((uint) Marshal.SizeOf(typeof(MEMORYSTATUSEX)))
            };
        }
    }
}
0
Soroush Falahati

Kimse GetPerformanceInfo 'den bahsetmedi. PInvoke imzalar mevcuttur.

Bu işlev, aşağıdaki sistem genelinde bilgileri kullanılabilir hale getirir:

  • CommitTotal
  • CommitLimit
  • CommitPeak
  • PhysicalTotal
  • PhysicalAvailable
  • SystemCache
  • KernelTotal
  • KernelPaged
  • KernelNonpaged
  • Sayfa boyutu
  • HandleCount
  • ProcessCount
  • THREADCOUNT

PhysicalTotal, OP'nin aradığı değerdir, değer sayfa sayısıdır, bu nedenle byte'a dönüştürmek için, döndürülen PageSize değeri ile çarpın.

0
Roman Starkov