Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
676 views
in Technique[技术] by (71.8m points)

.net - Reading performance counter from C#: Instance does not exist in the specified category

I'm trying to read a number of performance counters from a running .NET 4 application, from another .NET 4 application.

Some counters, such as Process\% Processor Time and ProcessPrivate Bytes work fine. However, as soon as I try to read a performance counter from one of the .NET categories, such as .NET CLR Memory# Gen 0 Collections, I get the following exception:

Instance 'MyApplication' does not exist in the specified Category

When I call:

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

It returns a very small set of instances, and MyApplication is indeed not in the list. However, when I look at my performance counters in perfmon, the list of instances I see there for the same category/counter is much longer and DOES include MyApplication.

Does anyone know why the .NET counters are not visible to my application?

(Note: The monitored application is started by the monitoring application, so they definitely run in the same user account. I also tried starting my monitoring application as Administrator and adding my account to the Performance Monitor Users group, to no effect.)

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

There are two settings for a project that can be relevant to your problem.

First and foremost, Project + Properties, Build tab, Platform target. On a machine with a 64-bit operating system, setting this to x86 will get you a list of instance names that do not include 64-bit processes. Perfmon.exe is a 64-bit process, it shows all instances, both 32-bit and 64-bit apps. Get the same behavior by setting the Platform target to AnyCPU, that's not the default anymore on Visual Studio 2010. Untick "Prefer 32-bit" if you see it.

Second is Project + Properties, Debug tab, "Enable the Visual Studio hosting process" option. When checked, you are debugging an process named yourapp.vshost.exe instead of yourapp.exe. That also affects the instance name, it will be yourapp.vshost. Not likely to be the problem in your specific case.

Be sure to update your question with this essential info if this guess wasn't accurate.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...