Если вы хотите использовать метод GlobalMemoryStatusEx
, вот пример:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class MEMORYSTATUSEX
{
public uint dwLength;
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys;
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
public MEMORYSTATUSEX()
{
this.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
}
}
class Program
{
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);
static void Main()
{
MEMORYSTATUSEX result = new MEMORYSTATUSEX();
if (GlobalMemoryStatusEx(result))
{
Console.WriteLine(
"{0}% memory left",
100.0 * result.ullAvailPhys / result.ullTotalPhys
);
}
}
}
Другая возможность, если вам не нравится Interop, - это использовать ComputerInfo класс (вам просто нужно добавить ссылку на сборку Microsoft.VisualBasic
):
class Program
{
static void Main()
{
Microsoft.VisualBasic.Devices.ComputerInfo ci = new Microsoft.VisualBasic.Devices.ComputerInfo();
Console.WriteLine(
"{0}% memory left",
100.0 * ci.AvailablePhysicalMemory / ci.TotalPhysicalMemory
);
}
}
И еще одна возможность - запросить счетчики производительности, чтобы выяснить доступную память:
class Program
{
static void Main()
{
// You could also use "Available Bytes", "Available KBytes", "Available MBytes"
PerformanceCounter pc = new PerformanceCounter("Memory", "Available Bytes");
Console.WriteLine(Convert.ToInt64(pc.NextValue()));
}
}