33

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

我可以使用如下所示的非常简单的程序重现这一点:

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

我确实确保我以管理员身份运行该程序。我是否在附加 VS/Debugger 的情况下运行它并不重要。我没有另一台装有 Windows 7 或 VS2010 的机器来测试它,所以我不确定这里的事情(或两者都复杂?)。它是 Windows 7 x64,我尝试强制应用程序在 x32 和 x64 中运行,但得到相同的结果。

4

1 回答 1

86

我的系统上的性能计数器似乎已损坏。尽管我没有完全遵循这篇文章,但它引导我找到了解决方案。这是我所做的:

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

lodctr /?

里面有用的东西...

然后输入:

lodctr /R

根据上一步中的文档,这会让 Windows根据当前的注册表设置和备份 INI 文件从头开始重建 perf 注册表字符串和信息。我有一种感觉,这就是魔法。但是,接下来我注意到 .NET 性能计数器不再存在,因此基于我键入以下内容以重新加载它们:

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

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

我希望有一天这对其他人有所帮助!

于 2009-10-08T22:52:51.107 回答