.NET 4.0 和 Windows 7 上的性能计数器
Posted
技术标签:
【中文标题】.NET 4.0 和 Windows 7 上的性能计数器【英文标题】:PerformanceCounters on .NET 4.0 & Windows 7 【发布时间】:2010-12-05 04:12:51 【问题描述】:我有一个在 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 中运行,但得到相同的结果。
【问题讨论】:
如果您不确定 Windows vs .net 版本,您可以尝试将 VS 中的项目属性更改为目标 .net 3.5,重新构建,然后重试。或者你可以在vista/xp机器上用2008构建相同的代码,然后将exe复制到Win7机器上。 【参考方案1】:我的系统上的性能计数器似乎已损坏。虽然我没有完全关注this post,但它引导我找到了解决方案。这是我所做的:
在具有管理员/提升权限的命令提示符中键入以下内容:
lodctr /?
里面有用的东西……
然后输入:
lodctr /R
根据上一步中的文档,这会让 Windows 根据当前的注册表设置和备份 INI 文件从头开始重建 perf 注册表字符串和信息。 我感觉这就是做了魔术。但是,接下来我注意到 .NET 性能计数器不再存在,因此基于 this 我键入以下内容以重新加载它们:
lodctr "C:\Windows\Microsoft.NET\Framework64\v4.0.20506\corperfmonsymbols.ini"
请注意,此路径适用于 x64 上的 .NET Framework 4.0。您可以想象框架/平台的其他变体的路径。我猜测您应该始终从已安装的 .NET 框架的最高版本加载计数器,但这只是猜测。
我希望有一天这对其他人有所帮助!
【讨论】:
有什么想法会导致这种情况发生吗? 感谢您的回答,为我节省了很多时间。 这是一个烦人的错误,感谢您的回答,也为我修复了它! 这个答案也为我节省了很多时间。谢谢! 我只需要运行lodctr /R
即可为我解决同样的问题。以上是关于.NET 4.0 和 Windows 7 上的性能计数器的主要内容,如果未能解决你的问题,请参考以下文章
哪些 GPS 加密狗适用于 Windows 7 和 .Net 4.0 System.Device.Location 命名空间?
Windows XP 上的 .Net Framework 4.0
如何在 IIS 7、Windows 7 上将 ASP.NET 4.0 添加为应用程序池
在 Windows Server 2012 上的 .NET 4.0 上运行服务构建时出现 System.Configuration.ConfigurationException