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

Ami*_*oei 11 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;
    }
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我错误的代码出错了吗?

Ami*_*oei 10

我发现自己的错误来自:http: //www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html

我变了

internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);
Run Code Online (Sandbox Code Playgroud)

static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);
Run Code Online (Sandbox Code Playgroud)

并改变了

GlobalMemoryStatusEx(ref statEX);
Run Code Online (Sandbox Code Playgroud)

GlobalMemoryStatusEx(statEX);
Run Code Online (Sandbox Code Playgroud)

它工作正常.坦克

  • 你是怎么得到这份工作的。我在 VS 中以管理员身份在管理员帐户上运行此代码。当我调用 GlobalMemoryStatusEX() 时,我收到一条异常消息:System.AccessViolationException HResult=0x80004003 Message=Attempted to read or write protected memory。这通常表明其他内存已损坏。 (2认同)

Bob*_*bby 5

怎么样:

My.Computer.Info.TotalPhysicalMemory
My.Computer.Info.AvailablePhysicalMemory
Run Code Online (Sandbox Code Playgroud)


Mez*_*Mez 5

如果 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";
Run Code Online (Sandbox Code Playgroud)