.NET 4.0和Windows 7上的PerformanceCounters

我有一个在VS2008和Vista上正常工作的程序,但是我在Windows 7和VS2010 / .NET Framework 4.0上试用它,它不工作。 最终问题是System.Diagnostics.PerformanceCounterCategory.GetCategories() (和其他PerformanceCounterCategory方法)不起作用。 我得到一个System.InvalidOperationException消息“无法加载计数器名称数据,因为从registry中读取了一个无效的索引”。

我可以用下面显示的非常简单的程序重现这个:

class Program { static void Main(string[] args) { foreach (var pc in System.Diagnostics.PerformanceCounterCategory.GetCategories()) { Console.WriteLine(pc.CategoryName); } } } 

我确实以pipe理员身份运行程序。 不pipe我是否用VS / Debugger运行它都没关系。 我没有另一台Windows 7或VS2010的机器来testing它,所以我不知道这是(或两者?)的东西是复杂的。 这是Windows 7 x64,我试图迫使应用程序运行在x32和x64,但得到相同的结果。

看来性能计数器在我的系统上损坏了。 虽然我没有完全按照这个post ,但是它使我find了解决办法。 这是我做的:

在具有pipe理员/提升特权的命令提示符中键入以下内容:

 lodctr /? 

那里有用的东西…

然后键入:

 lodctr /R 

根据上一步的文档,这将得到Windows 根据当前registry设置和备份INI文件从头开始重buildperfregistrystring和信息。 我有一种感觉,这是什么魔术。 但是,接下来我注意到.NET性能计数器不在那里了,所以我input以下内容来重新加载它们:

 lodctr "C:\Windows\Microsoft.NET\Framework64\v4.0.20506\corperfmonsymbols.ini" 

请注意,此path适用于x64上的.NET Framework 4.0。 你可以想像其他变体的框架/平台的path。 我你应该总是从你安装的.NET框架的最高版本加载计数器,但这只是一个猜测。

我希望这有助于别人有一天!