Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用pinvoke访问系统对象并查询有关进程的信息_C#_.net_Performance_Process_Pinvoke - Fatal编程技术网

C# 使用pinvoke访问系统对象并查询有关进程的信息

C# 使用pinvoke访问系统对象并查询有关进程的信息,c#,.net,performance,process,pinvoke,C#,.net,Performance,Process,Pinvoke,虽然我了解了p/invoke,但与使用.net方法相比,我可以看到一些显著的性能提升,这是因为它通过系统DLL查询信息 例如,通过导入此代码中的dll [DllImport("psapi.dll", SetLastError = true)] static extern bool GetProcessMemoryInfo(IntPtr hProcess, out PROCESS_MEMORY_COUNTERS Memcounters, int size); 我可以访问有关进程的信息,这样我就可

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

例如,通过导入此代码中的dll

[DllImport("psapi.dll", SetLastError = true)]
static extern bool GetProcessMemoryInfo(IntPtr hProcess, out PROCESS_MEMORY_COUNTERS Memcounters, int size);
我可以访问有关进程的信息,这样我就可以询问所有我需要知道的关于它的内存使用情况

但正如我在该链接中所注意到的,似乎我可以访问一个不被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
CPU时间
内存使用量
,性能问题是,与使用.net方法相比,这是一个不可忽视的性能增益

所以问题是:

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


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

上次我用P/inCKE工作,在托管C++库中完成它要容易得多,然后将它导入到我的C应用程序中。如果您知道C++,在涉及到这些操作时,您将省去很多麻烦。

您不使用获得该信息的pNojk,使用Sypor。管理命名空间中的类。WMI的薄包装。用于实验,还可以生成所需的C#代码。您认为从pinvoke中看到的任何性能优势都只存在于您的想象中。同意@HansPassant-系统中的WMI包装。管理名称空间就是方法。@JerKimball谢谢您提供的信息,我将检查该选项,我想我已经发现这不是pinvoke的方法。。