2013-06-20 11 views
5

gdy dowiaduję się o p/wywołać mogłem zobaczyć jakieś zauważalne wzrost wydajności w porównaniu z wykorzystaniem metod .net to dlatego, że jest odpytywanie informacji za pośrednictwem systemów plików DLLKorzystanie pinvoke aby uzyskać dostęp do obiektów systemowych i zapytanie o procesie

na przykład poprzez importowanie biblioteki dll w tym kodzie

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

mogę uzyskać dostęp do informacji dotyczących danego procesu, więc może kwestionować wszystko, co trzeba wiedzieć o jego zużycie pamięci.

Ale jak mogłem zanotować w tym linku The Win32_PerfFormattedData_PerfProc_Process i Win32_PerfRawData_PerfProc_Process wydaje się, że mogę uzyskać dostęp do klasy, która nie jest używana przez P/invoke i zapytanie o bardzo konkretne informacje.

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

uint32 PageFaultsPerSec; 
uint64 PageFileBytes; 
uint64 PageFileBytesPeak; 

jak widać, nie jest również oddzielne funkcje zarówno 32bit/64bit przetwarza

Więc mogę wiedzieć na pewno, że jestem coraz dokładnie to, czego potrzebuję do kwerendy i wtedy zauważyłem, że mógłbym dostać wszystko, czego potrzebuję dzięki tej klasy, co udało mi się znaleźć w .NET równoważne jedną chyba (WMI), ale szukałem właśnie to, że dla klasy 1, będę na pewno wiedzą, że jestem zapytań zadania prawidłowo 32-bitowe zadania i 64bit i 2 liczniki są razem w jednej klasie, I/O, CPU Time, Memory usage i kwestii wydajności, że jest to dość notisble wzrost wydajności w porównaniu z wykorzystaniem .NET Pproach.

Więc pytanie brzmi:

jaki sposób uzyskać dostęp do tej klasy za pomocą metody jak P/Invoke, a nie własnych klas .NET?

I rzeczywiście najciekawszy link, jaki znalazłem odnośnie do liczników zarządzanych .net w szczegółach to This Link, myślę, że jest to odpowiednik linków powyżej win32.

+7

Nie używać pinvoke że uzyskać te informacje, należy użyć klas w przestrzeni nazw System.Management. Cienkie opakowania dla WMI. Użyj [tego narzędzia] (http://www.microsoft.com/en-us/download/details.aspx?id=8572) do eksperymentu, generuje również potrzebny kod C#. Każda perfekcyjna korzyść, którą uważasz, że widzisz z Pinvoke, istnieje tylko w Twojej wyobraźni. –

+1

zgodzić się z @HansPassant - owinięcie WMI w 'nazw System.Management' jest do zrobienia tutaj. – JerKimball

+0

@JerKimball dzięki za informacje i sprawdzi, czy opcja Chyba już zorientowali jej nie droga z pinvoke .. – LoneXcoder

Odpowiedz

0

Ostatni raz pracowałem z P/Invoke, było o wiele łatwiejsze do osiągnięcia w zarządzanym C++ biblioteki, a następnie zaimportować że w mojej aplikacji C#. Jeśli znasz C++, zaoszczędzisz sobie wiele kłopotów, jeśli chodzi o tego rodzaju operacje.

Powiązane problemy