2013-06-20 14 views
5

trong khi tôi tìm hiểu về p/gọi tôi có thể thấy một số lợi ích hiệu suất đáng kể so với sử dụng phương pháp .net đó là bởi vì nó được truy vấn thông tin qua hệ thống dllsSử dụng pinvoke để có được quyền truy cập vào đối tượng hệ thống và truy vấn về một quá trình

Ví dụ: bằng cách nhập dll vào mã này

[DllImport("psapi.dll", SetLastError = true)] 
static extern bool GetProcessMemoryInfo(IntPtr hProcess, out PROCESS_MEMORY_COUNTERS Memcounters, int size); 

Tôi có thể truy cập thông tin về quy trình được đề cập để tôi có thể hỏi tất cả những gì tôi cần biết về mức sử dụng bộ nhớ.

Nhưng như tôi có thể ghi chú trong liên kết đó Win32_PerfFormattedData_PerfProc_ProcessWin32_PerfRawData_PerfProc_Process có vẻ như tôi có thể truy cập một lớp không được P/gọi và truy vấn thông tin rất cụ thể.

uint64 IODataOperationsPerSec; 
uint64 IOOtherOperationsPerSec; 
uint64 IOReadBytesPerSec; 
uint64 IOReadOperationsPerSec; 
uint64 IOWriteBytesPerSec; 
uint64 IOWriteOperationsPerSec; 
uint64 IODataBytesPerSec; 
uint64 IOOtherBytesPerSec; 

uint32 PageFaultsPerSec; 
uint64 PageFileBytes; 
uint64 PageFileBytesPeak; 

chức năng như bạn có thể thấy, có cũng được tách ra cho cả 32bit/64bit xử lý

Vì vậy, ở đây tôi có thể biết chắc chắn, rằng tôi nhận được chính xác những gì tôi cần phải truy vấn và sau đó tôi nhận thấy rằng Tôi có thể nhận được tất cả những gì tôi cần thông qua lớp đó, mà tôi có thể tìm thấy trong .net tương đương với tôi đoán (wmi) nhưng tôi đang tìm kiếm chính xác điều đó, một lớp cho 1, tôi chắc chắn sẽ biết rằng tôi đang truy vấn một cách chính xác các tác vụ 32bit và 64bit nhiệm vụ và 2 quầy đều cùng nhau trong một lớp, I/O, CPU Time, Memory usage và vấn đề hiệu suất mà nó đạt được hiệu suất khá cao so với sử dụng .net a pproach.

Vì vậy câu hỏi là:

làm thế nào để tôi nhận được quyền truy cập vào lớp đó thông qua sử dụng một phương pháp như P/gọi chứ không chứa lớp .net riêng?

Và thực sự là liên kết thú vị nhất mà tôi đã tìm thấy liên quan đến quầy để quản lý .net chi tiết là This Link, tôi đoán đó là tương đương với các liên kết win32 ở trên.

+7

Bạn không sử dụng pinvoke nhận thông tin đó, bạn sử dụng các lớp trong không gian tên System.Management. Trình bao bọc mỏng cho WMI. Sử dụng [tiện ích này] (http://www.microsoft.com/en-us/download/details.aspx?id=8572) để thử nghiệm, cũng tạo mã C# mà bạn cần. Bất kỳ lợi ích perf bạn nghĩ rằng bạn nhìn thấy từ pinvoke chỉ tồn tại trong trí tưởng tượng của bạn. –

+1

Concur với @HansPassant - trình bao bọc WMI trong không gian tên 'System.Management' là cách để đi đến đây. – JerKimball

+0

@ JerKimball cảm ơn vì thông tin tôi sẽ kiểm tra tùy chọn đó tôi đoán tôi đã tìm ra cách của nó không phải là cách để đi với pInvoke .. – LoneXcoder

Trả lời

0

Lần trước tôi làm việc với P/Invoke, việc thực hiện dễ dàng hơn trong thư viện C++ được quản lý và sau đó nhập vào ứng dụng C# của tôi. Nếu bạn biết C++, bạn sẽ tiết kiệm cho mình rất nhiều rắc rối khi nói đến những loại hoạt động đó.

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