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

如何获得C#中的总物理内存?,c#,memory-management,C#,Memory Management,我正在使用GlobalMemoryStatusEx函数检索有关内存的信息,但该函数无法正常工作。它为所有属性返回0。我认为这个功能在我的Windows7环境中不起作用 [StructLayout(LayoutKind.Sequential)] internal struct MEMORYSTATUSEX { internal uint dwLength; internal uint dwMemoryLoad; interna

我正在使用
GlobalMemoryStatusEx
函数检索有关内存的信息,但该函数无法正常工作。它为所有属性返回0。我认为这个功能在我的Windows7环境中不起作用

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

谁能告诉我错误代码哪里出了问题吗?

您可以使用以下模板:

long memory = Process.GetCurrentProcess().PeakVirtualMemorySize64;
和另一个名为Peak*64的属性如何:

My.Computer.Info.TotalPhysicalMemory
My.Computer.Info.AvailablePhysicalMemory
如果你能:

请参考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";
int bytespermibyte=(1我发现我的错误来自:

我变了

internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);

改变

GlobalMemoryStatusEx(ref statEX);

它工作正常。
坦克

在调用
GlobalMemoryStatusEx
之前,您忘记设置了
statEX.dwLength

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

坦克,但我是用C#.Net写的。@Amir:添加对Microsoft.VisualBasic.dll的引用。@Amir,对不起,我总是忘记我的命名空间在C#中“本机”不存在:(@Amir:您仍然可以访问属性:添加对“Microsoft.VisualBasic”的引用),然后创建Microsoft.VisualBasic.Devices.ComputerInfo
类型的实例,该实例对应于@Bobby的答案中的
My.Computer.Info
。我这样做了,得到了否定的“垃圾”值。具有8gb ramI的Windows 64我认为操作询问的是物理内存,因此该过程没有那么有用。您尝试过WMI吗?它速度较慢,但必须在每个操作系统上工作。好的,我们应该设置它,但主要问题是“ref”关键字。您应该将其从函数的删除和使用中删除。@dalle:fyi因为MemoryStatuex函数是非托管的,所以您可以直接使用sizeof(MemoryStatuex),而无需调用互操作助手(封送)。您是如何完成这项工作的。我在VS中以管理员身份以管理员帐户运行此代码。当我调用GlobalMemoryStatuex()时我收到一个异常消息:System.AccessViolationException HResult=0x80004003 Message=试图读取或写入受保护的内存。这通常表示其他内存已损坏。在.NET内核中无法工作,因为VB尚未实现。
GlobalMemoryStatusEx(statEX);
MEMORYSTATUSEX statEX = new MEMORYSTATUSEX();
statEX.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
GlobalMemoryStatusEx(ref statEX);