.NET 4.0上的PerformanceCounters& Windows 7的

时间:2009-10-08 22:07:16

标签: c# windows-7 .net-4.0 performancecounter

我有一个在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中运行,但得到相同的结果。

1 个答案:

答案 0 :(得分:87)

我的系统似乎性能计数器已损坏。虽然我没有完全遵循this post,但它引导我找到解决方案。这是我做的:

在具有administrator / elevate权限的命令提示符中键入以下内容:

lodctr /?

那里有用的东西......

然后输入:

lodctr /R

根据前一步骤中的文档,这将获得窗口根据当前注册表设置和备份INI文件从头开始重建perf注册表字符串和信息。我感觉这是什么做了魔术。但是,接下来我注意到.NET性能计数器不再存在,所以基于this我输入以下内容来重新加载它们:

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

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

我希望有一天能帮助别人!