Как я могу получить общую физическую память в C#?

Я использую GlobalMemoryStatusEx функция для получения информации о памяти, но эта функция работает неправильно. Возвращает 0 для всех свойств. Я не думаю, что эта функция работает в моей среде Windows 7.

    [StructLayout(LayoutKind.Sequential)]
    internal struct MEMORYSTATUSEX
    {
        internal 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;
    }
    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);

    private void btnGlobalMemoryStatusEX_Click(object sender, EventArgs e)
    {
        MEMORYSTATUSEX statEX = new MEMORYSTATUSEX();
        GlobalMemoryStatusEx(ref statEX);

        double d = (double)statEX.ullTotalPhys;
    }

Кто-нибудь может сказать мне, где я ошибся с неправильным кодом?

5 ответов

Решение

Я нахожу свою ошибку по адресу: http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html

Я изменился

internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);

к

static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);

и изменил

GlobalMemoryStatusEx(ref statEX);

к

GlobalMemoryStatusEx(statEX);

Это работает правильно. Танки

Как насчет:

My.Computer.Info.TotalPhysicalMemory
My.Computer.Info.AvailablePhysicalMemory

Если C# вы можете:

Ссылка на Microsoft.VisualBasic сборка. Затем импортировать Microsoft.VisualBasic.Devices Пространство имен.
И, наконец, используйте ComputerInfo для получения полной физической памяти.

int bytesPerMebibyte = (1 << 20);  // http://physics.nist.gov/cuu/Units/binary.html
ComputerInfo myCompInfo = new ComputerInfo();
string physicalMemory = "Physical Memory: "
    + (myCompInfo.TotalPhysicalMemory / bytesPerMebibyte) + " MB";

Вы можете использовать эти шаблоны:

long memory = Process.GetCurrentProcess().PeakVirtualMemorySize64;

И еще одна недвижимость с именами Peak*64

Вы забыли установить statEX.dwLength перед звонком GlobalMemoryStatusEx,

MEMORYSTATUSEX statEX = new MEMORYSTATUSEX();
statEX.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
GlobalMemoryStatusEx(ref statEX);
Другие вопросы по тегам