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

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

某些计数器,例如Process\% Processor TimeProcess\Private Bytes工作正常。 但是,只要我尝试从其中一个.NET类别(例如.NET CLR Memory\# Gen 0 Collections读取性能计数器,就会出现以下exception:

 Instance 'MyApplication' does not exist in the specified Category 

我打电话的时候:

 new PerformanceCounterCategory(".NET CLR Memory").GetInstanceNames() 

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

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

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

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

首先,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。 在您的具体情况下不太可能出现问题。

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