5

当我了解 p/invoke 时,与使用 .net 方法相比,我可以看到一些明显的性能提升,这是因为它通过系统 dll 查询信息

例如通过在此代码中导入 dll

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

我可以访问有关进程的信息,因此我可以质疑所有我需要知道的关于它的内存使用情况。

但正如我在该链接中指出的那样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/O以及性能问题,这是一个相当明显的性能与使用 .net 方法相比获得的收益。CPU TimeMemory usage

所以问题是

如何通过使用 P/invoke 之类的方法而不是自己的 .net 类来访问该类?

实际上,我发现的关于托管 .net 计数器的最有趣的链接是This Link,我想这相当于上面的 win32 链接。

4

1 回答 1

0

上次我使用 P/Invoke 时,在托管 C++ 库中完成要容易得多,然后将其导入我的 c# 应用程序。如果您了解 C++,那么在进行此类操作时,您会省去很多麻烦。

于 2013-09-17T10:29:02.347 回答