.NET 4.0和Windows 7上的性能计数器

34

我有一个在VS2008Vista上运行良好的程序,但我正在尝试在Windows 7VS2010/.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/调试器运行它都没有关系。我没有另一台配有 Windows 7VS2010 的机器来测试它,因此我不确定是哪个在这里使事情复杂了(或者两个都是?)。它是 Windows 7 x64,我尝试强制应用程序在 x32x64 中运行,但结果相同。


1
如果您不确定 Windows 和 .net 版本之间的问题,可以尝试在 VS 中更改项目属性以针对 .net 3.5,重新构建,然后再次尝试。或者您可以在安装了 2008 的 Vista/XP 计算机上构建相同的代码,并将 exe 复制到 Win7 计算机上。 - JMarsch
1个回答

87

看起来我的系统性能计数器已经损坏。虽然我没有完全按照这篇帖子的方法操作,但它引导我找到了解决方案。以下是我的操作步骤:

在一个以管理员权限运行的命令提示符中输入以下内容:

lodctr /?

Useful stuff in there...

Then typed:

lodctr /R

根据上一步的文档,这将使Windows重新根据当前注册表设置和备份INI文件从头开始重建性能注册表字符串和信息。我有一种感觉这就是魔法所在。然而,接下来我注意到.NET性能计数器不再存在,因此根据此处,我键入以下内容以重新加载它们:
lodctr "C:\Windows\Microsoft.NET\Framework64\v4.0.20506\corperfmonsymbols.ini"

请注意,此路径适用于 x64 上的 .NET Framework 4.0。您可以想象其他变体的框架/平台的路径。我猜测您应该始终从已安装的最高版本的 .NET Framework 加载计数器,但这只是一个猜测。
希望这能在将来帮助其他人!

1
这个答案也帮我省了不少时间。谢谢! - KnightsArmy
1
我正准备重新编写我的代码以找出问题所在。幸运的是,我遇到了这个,现在一切都很好 :) - Sandeep Bansal
1
这解决了我在启动.exe时Raven无法工作的问题。非常感谢Scott。 - Subby
5
对于我来说,只需要运行 lodctr /R 就能解决同样的问题。 - absynce
1
.GetCategories命令。该问题的根本原因是nVidia驱动程序,请参见https://dev59.com/Q3bZa4cB1Zd3GeqPJL3Z。 - Contango
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接