PerformanceCounters на .NET 4.0 и Windows 7
У меня есть программа, которая отлично работает на 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
Кажется, счетчики производительности были повреждены в моей системе. Хотя я не следил за этот пост, это привело меня к решению. Вот что я сделал:
В командной строке с правами администратора/подписи введите следующее:
lodctr /?
Полезный материал там...
Затем напечатано:
lodctr /R
В соответствии с документами с предыдущего шага, это получает окна, чтобы перестроить первичную строку реестра и информацию с нуля на основе текущих параметров реестра и резервных файлов INI. У меня такое чувство, что это волшебство. Однако в следующий раз я заметил, что счетчики производительности .NET не были там больше, поэтому на основе this Я набрал следующее, чтобы перезагрузить их:
lodctr "C:\Windows\Microsoft.NET\Framework64\v4.0.20506\corperfmonsymbols.ini"
Обратите внимание, что этот путь для .NET Framework 4.0 на x64. Вы можете представить себе путь для других вариантов рамки/платформы. Я предполагаю, что вы всегда должны загружать счетчики с самой высокой версии .NET Framework, которую вы установили, но это всего лишь предположение.
Я надеюсь, что это когда-нибудь поможет кому-то еще!