当我了解 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_Process和Win32_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 Time
Memory usage
所以问题是:
如何通过使用 P/invoke 之类的方法而不是自己的 .net 类来访问该类?
实际上,我发现的关于托管 .net 计数器的最有趣的链接是This Link,我想这相当于上面的 win32 链接。