2013-06-20 31 views
5

,而我瞭解p訪問系統對象和查詢/調用我可以看到一些明顯的性能提升相比,使用.NET方法這是因爲它是查詢通過系統中的信息的DLL使用的PInvoke獲取有關過程

例如,通過在此代碼

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

我能得到有關問題的過程,所以我可能會問,我需要了解它的內存使用信息獲取導入DLL。

但正如我可以在該鏈接中注意到Win32_PerfFormattedData_PerfProc_ProcessWin32_PerfRawData_PerfProc_Process似乎我可以訪問一個沒有被P/invoke使用的類並查詢非常特定的信息。

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

uint32 PageFaultsPerSec; 
uint64 PageFileBytes; 
uint64 PageFileBytesPeak; 

兩個32位/ 64位,你可以看到,這裏還分離功能的處理

所以在這裏,我可以肯定知道,那我得到正是我需要查詢,然後我注意到,我可以通過該課程獲得我需要的所有內容,我可以在.net中找到所需的所有內容。我猜想(wmi),但我正在尋找那個,一個爲1的課程,我一定知道我正在正確查詢32位任務和64位任務和2個計數器都在一個類中,I/OCPU Time,Memory usage和性能問題,它是一個相當不可忽視的性能增益相比,使用.net a方法。

所以問題是

我怎麼通過使用像P /調用,而不是自己的.NET類的方法可以訪問這門課嗎?

實際上,我發現有關託管.net的計數器最有趣的鏈接是This Link,我想這等價於上面的win32鏈接。

+7

您不使用獲取該信息的pinvoke,而是使用System.Management命名空間中的類。 WMI的薄包裝。使用[此實用程序](http://www.microsoft.com/en-us/download/details.aspx?id=8572)進行實驗,也會生成您需要的C#代碼。任何你認爲你從頭腦中看到的性能優勢都只存在於你的想象中。 –

+1

與@HansPassant同時出現 - 「System.Management」命名空間中的WMI包裝是這裏的方法。 – JerKimball

+0

@JerKimball感謝您的信息,我會檢查這個選項,我想我已經認爲它不是與pInvoke去的方式.. – LoneXcoder

回答

0

上次我使用P/Invoke工作時,在一個託管C++庫中完成工作要容易得多,然後將其導入到我的c#應用程序中。如果您瞭解C++,那麼當您涉及這些操作時,您將爲您省去很多麻煩。