PerformanceCounters в .NET 4.0 и Windows 7 - PullRequest
33 голосов
/ 09 октября 2009

У меня есть программа, которая отлично работает на 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 Ответ

88 голосов
/ 09 октября 2009

Кажется, счетчики производительности были повреждены в моей системе. Хотя я не следовал этому посту точно, это привело меня к решению. Вот что я сделал:

В командной строке с правами администратора / повышения введите следующее:

lodctr /?

Полезные вещи там ...

Затем набрал:

lodctr /R

В соответствии с документами предыдущего шага, это заставляет Windows перестраивать строки реестра perf и информацию с нуля, основываясь на текущих настройках реестра и файлах INI резервного копирования. У меня такое ощущение, что это то, что сделал магия. Однако затем я заметил, что счетчики производительности .NET больше не существуют, поэтому на основе this я набрал следующее, чтобы перезагрузить их:

lodctr "C:\Windows\Microsoft.NET\Framework64\v4.0.20506\corperfmonsymbols.ini"

Обратите внимание, что этот путь предназначен для .NET Framework 4.0 на x64. Вы можете представить путь для других вариаций фреймворка / платформы. Я догадываюсь вы всегда должны загружать счетчики из самой высокой версии .NET Framework, которую вы установили, но это всего лишь предположение.

Надеюсь, это когда-нибудь кому-нибудь поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...