34 votes

PerformanceCounters sur .NET 4.0 et Windows 7

J'ai un programme qui fonctionne bien sous VS2008 et Vista, mais je l'essaie sous Windows 7 et VS2010 / .NET Framework 4.0 et ça ne marche pas. En fin de compte, le problème est le suivant System.Diagnostics.PerformanceCounterCategory.GetCategories() (et d'autres méthodes de PerformanceCounterCategory) ne fonctionne pas. Je reçois une System.InvalidOperationException avec le message "Cannot load Counter Name data because an invalid index '' was read from the registry".

Je peux reproduire ce phénomène avec le programme très simple présenté ci-dessous :

class Program
{
    static void Main(string[] args)
    {
        foreach (var pc in System.Diagnostics.PerformanceCounterCategory.GetCategories())
        {
            Console.WriteLine(pc.CategoryName);
        }
    }
}

Je me suis assuré que j'exécutais le programme en tant qu'administrateur. Le fait que je l'exécute avec VS/Debugger attaché ou non n'a aucune importance. Je n'ai pas d'autre machine avec Windows 7 ou VS2010 pour le tester, donc je ne suis pas sûr de ce qui complique les choses ici (ou les deux ?). Il s'agit de Windows 7 x64 et j'ai essayé de forcer l'application à s'exécuter à la fois en x32 et x64 mais j'obtiens les mêmes résultats.

87voto

activescott Points 4359

Il semble que les compteurs de performance aient été corrompus sur mon système. Bien que je n'aie pas suivi ce poste exactement, cela m'a conduit à la solution. Voici ce que j'ai fait :

Dans une invite de commande avec des privilèges d'administrateur/élevé, tapez ce qui suit :

lodctr /?

Des trucs utiles là-dedans...

Puis il a tapé :

lodctr /R

D'après les documents de l'étape précédente, cela permet à Windows de reconstruit les chaînes et les informations du registre de perf à partir de zéro, sur la base des paramètres actuels du registre et des fichiers INI de sauvegarde. J'ai le sentiment que c'est ce qui a fait la magie. Cependant, j'ai ensuite remarqué que les compteurs de performance de .NET n'étaient plus là. este J'ai tapé ce qui suit pour les recharger :

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

Notez que ce chemin est pour .NET Framework 4.0 sur x64. Vous pouvez imaginer le chemin pour d'autres variations du framework/plateforme. Je suis deviner vous devriez toujours charger les compteurs à partir de la version la plus élevée du cadre .NET que vous avez installé, mais ce n'est qu'une supposition.

J'espère que cela aidera quelqu'un d'autre un jour !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X