.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框架的最高版本加载计数器,但这只是一个猜测。

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

  • 哪个passwordchar在winforms文本框中显示黑点(?)?
  • Response.Redirect到新窗口
  • 为什么在接口上定义的C#4可选参数没有被强制实现类?
  • 访问数组越界没有错误,为什么?
  • 为什么strtok()被认为是不安全的?
  • “此程序集由比当前加载的运行时更新的运行时构build,无法加载”
  • 使用MPI在C中发送二维数组块
  • 何时使用C中的位域?
  • 将基本64string转换为图像并保存
  • 在什么情况下,我们需要包含<cassert>?
  • 我可以不用Visual Studio下载Visual C ++命令行编译器吗?