2009-10-12 43 views
10

Tôi đang sử dụng chức năng GlobalMemoryStatusEx để truy xuất thông tin về bộ nhớ, nhưng chức năng này không hoạt động chính xác. Nó trả về 0 cho tất cả các thuộc tính. Tôi không nghĩ rằng chức năng này hoạt động trong môi trường Windows 7 của tôi.Làm thế nào tôi có thể nhận được tổng bộ nhớ vật lý trong C#?

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

Ai có thể cho tôi biết tôi đã sai mã sai ở đâu?

+0

Bạn đã thử WMI chưa? Nó chậm hơn, nhưng phải hoạt động trên mọi hệ điều hành. – Restuta

Trả lời

9

tôi thấy sai lầm của tôi từ: http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html

tôi Changed

internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); 

Để

static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer); 

và thay đổi

GlobalMemoryStatusEx(ref statEX); 

Để

GlobalMemoryStatusEx(statEX); 

Nó hoạt động chính xác. Xe tăng

+0

làm thế nào bạn có được công việc này.Tôi đang chạy mã này trong VS chạy như quản trị trên tài khoản Admin.khi tôi gọi GlobalMemoryStatusEX () Tôi nhận được một ngoại lệ nói rằng: System.AccessViolationException HResult = 0x80004003 Tin nhắn = Đã cố gắng đọc hoặc ghi bộ nhớ được bảo vệ.Đây là dấu hiệu cho thấy rằng bộ nhớ khác bị hỏng. – Alvaromon

1

bạn có thể sử dụng các mẫu này:

long memory = Process.GetCurrentProcess().PeakVirtualMemorySize64; 

Và tính chất khác với tên Đỉnh * 64

+0

Tôi tin rằng OP hỏi về bộ nhớ vật lý, vì vậy Quy trình không hữu ích. –

5

Làm thế nào về:

My.Computer.Info.TotalPhysicalMemory 
My.Computer.Info.AvailablePhysicalMemory 
+0

xe tăng, nhưng tôi viết bằng C# .Net. –

+0

@Amir: Thêm tham chiếu đến Microsoft.VisualBasic.dll. – dalle

+0

@Amir, xin lỗi, tôi luôn quên rằng My-Namespace không tồn tại 'nguyên bản' trong C#. :( – Bobby

4

Nếu C# bạn có thể:

tham khảo các Microsoft.VisualBasic lắp ráp. Sau đó nhập Microsoft.VisualBasic.Devices không gian tên.
Và cuối cùng sử dụng ComputerInfo để nhận tổng bộ nhớ vật lý.

int bytesPerMebibyte = (1 << 20); // http://physics.nist.gov/cuu/Units/binary.html 
ComputerInfo myCompInfo = new ComputerInfo(); 
string physicalMemory = "Physical Memory: " 
    + (myCompInfo.TotalPhysicalMemory/bytesPerMebibyte) + " MB"; 
0

Bạn quên đặt statEX.dwLength trước khi gọi GlobalMemoryStatusEx.

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

Tôi đặt nó nhưng nó không hoạt động, –

+1

Ok, chúng ta nên thiết lập điều này nhưng vấn đề chính là từ khóa "ref". có thể xóa nó khỏi việc xóa và sử dụng chức năng. –

+0

@ dalle: fyi vì hàm MEMORYSTATUSEX không được quản lý, bạn có thể sử dụng sizeof (MEMORYSTATUSEX) trực tiếp, mà không cần gọi trình trợ giúp interop (Marshal). –

Các vấn đề liên quan