如何获得C#中的总物理内存?

时间:2009-10-12 08:12:00

标签: c# memory-management

我正在使用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 个答案:

答案 0 :(得分:10)

我发现自己的错误: 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);

它正常工作。 罐

答案 1 :(得分:5)

怎么样:

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

答案 2 :(得分:4)

如果是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";

答案 3 :(得分:1)

您可以使用此模板:

long memory = Process.GetCurrentProcess().PeakVirtualMemorySize64;

另一个名为Peak * 64

的属性

答案 4 :(得分:0)

在致电statEX.dwLength之前,您忘了设置GlobalMemoryStatusEx

MEMORYSTATUSEX statEX = new MEMORYSTATUSEX();
statEX.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
GlobalMemoryStatusEx(ref statEX);