Как я могу получить общую физическую память в 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);