.NET 4.0和Windows 7上的PerformanceCounters
我有一个在VS2008和Vista上正常工作的程序,但是我在Windows 7和VS2010 / .NET Framework 4.0上试用它,它不工作。 最终问题是System.Diagnostics.PerformanceCounterCategory.GetCategories() (和其他PerformanceCounterCategory方法)不起作用。 我得到一个System.InvalidOperationException消息“无法加载计数器名称数据,因为从registry中读取了一个无效的索引”。
我可以用下面显示的非常简单的程序重现这个:
class Program { static void Main(string[] args) { foreach (var pc in System.Diagnostics.PerformanceCounterCategory.GetCategories()) { Console.WriteLine(pc.CategoryName); } } }
我确实以pipe理员身份运行程序。 不pipe我是否用VS / Debugger运行它都没关系。 我没有另一台Windows 7或VS2010的机器来testing它,所以我不知道这是(或两者?)的东西是复杂的。 这是Windows 7 x64,我试图迫使应用程序运行在x32和x64,但得到相同的结果。
看来性能计数器在我的系统上损坏了。 虽然我没有完全按照这个post ,但是它使我find了解决办法。 这是我做的:
在具有pipe理员/提升特权的命令提示符中键入以下内容:
lodctr /?
那里有用的东西…
然后键入:
lodctr /R
根据上一步的文档,这将得到Windows 根据当前registry设置和备份INI文件从头开始重buildperfregistrystring和信息。 我有一种感觉,这是什么魔术。 但是,接下来我注意到.NET性能计数器不在那里了,所以我input以下内容来重新加载它们:
lodctr "C:\Windows\Microsoft.NET\Framework64\v4.0.20506\corperfmonsymbols.ini"
请注意,此path适用于x64上的.NET Framework 4.0。 你可以想像其他变体的框架/平台的path。 我猜你应该总是从你安装的.NET框架的最高版本加载计数器,但这只是一个猜测。
我希望这有助于别人有一天!
- .NET 4.0在CI服务器上生成问题
- 混合模式程序集是针对版本“v1.1.4322”构build的
- GACUTIL在Windows 7中的.NET Framework 4.0在哪里?
- ExpandoObject有什么好处?
- 如何将Dynamic方法调用作为DynamicMetaObject.BindInvokeMember的结果来表示?
- 使用多个MemoryCache实例
- maxRequestLength的最大值是多less?
- 如果fiddler 2可以通过HTTPS解密所有的电话,SSL的意义何在?
- System.MissingMethodException Int32 System.Environment。 get_CurrentManagedThreadId()