从C#读取性能计数器:指定类别中不存在实例

rix*_*rrr 10 .net c# performancecounter

我正在尝试从另一个.NET 4应用程序中运行的.NET 4应用程序中读取许多性能计数器.

某些计数器,如Process\% Processor TimeProcess\Private Bytes做工精细.但是,只要我尝试从其中一个.NET类别中读取性能计数器,例如.NET CLR Memory\# Gen 0 Collections,我就会遇到以下异常:

Instance 'MyApplication' does not exist in the specified Category
Run Code Online (Sandbox Code Playgroud)

我打电话的时候:

new PerformanceCounterCategory(".NET CLR Memory").GetInstanceNames()
Run Code Online (Sandbox Code Playgroud)

它返回一组非常小的实例,而MyApplication确实不在列表中.但是,当我查看我的性能计数器时perfmon,我在同一类别/计数器中看到的实例列表要长得多,并且包括MyApplication.

有谁知道为什么我的应用程序看不到.NET计数器?

(注意:受监视的应用程序由监视应用程序启动,因此它们肯定在同一用户帐户中运行.我还尝试以管理员身份启动我的监视应用程序并将我的帐户添加到性能监视器用户组,但不起作用.)

Han*_*ant 19

项目有两个与您的问题相关的设置.

首先,Project + Properties,Build选项卡,Platform目标.在具有64位操作系统的计算机上,将其设置为x86将获得包含64位进程的实例名称列表.Perfmon.exe是一个64位进程,它显示所有实例,包括32位和64位应用程序.通过将Platform目标设置为AnyCPU来获得相同的行为,这在Visual Studio 2010上不再是默认设置.如果您看到它,请取消"首选32位".

其次是Project + Properties,Debug选项卡,"启用Visual Studio托管过程"选项.选中时,您正在调试名为yourapp.vshost.exe而不是yourapp.exe的进程.这也会影响实例名称,它将是yourapp.vshost.在您的具体情况下不太可能出现问题.

如果此猜测不准确,请务必使用此基本信息更新您的问题.

  • 这是由于平台目标.从x86更改为'任何CPU'工作.非常感谢,我从来没有想过这个! (2认同)