我有一个在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中运行,但得到相同的结果。
答案 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框架的最高版本加载计数器,但这只是猜测。
我希望有一天能帮助别人!