2009-10-08 28 views
33

Ho un programma che funziona bene su VS2008 e Vista, ma sto provando su Windows 7 e VS2010/.NET Framework 4.0 e non funziona. In definitiva il problema è che System.Diagnostics.PerformanceCounterCategory.GetCategories() (e altri metodi di PerformanceCounterCategory) non funziona. Ricevo System.InvalidOperationException con il messaggio "Impossibile caricare i dati del nome contatore perché un indice non valido" è stato letto dal registro. "PerformanceCounters su .NET 4.0 e Windows 7

posso riprodurre questo con il semplice programma riportato di seguito:

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

ho fatto sicuro che sto eseguendo il programma come un amministratore. Non importa se lo eseguo con VS/Debugger allegato o no. Non ho un altro computer con Windows 7 o VS2010 per testarlo, quindi non sono sicuro di quali siano le cose più complicate qui (o entrambe?). È Windows 7 x64 e ho provato a forzare l'esecuzione dell'app sia in x32 che in x64 ma ottenere gli stessi risultati.

+1

Se non si è sicuri della versione Windows rispetto a .net, è possibile provare a modificare le proprietà del progetto in VS per scegliere .net 3.5, ricostruire e riprovare. Oppure è possibile creare lo stesso codice su una macchina vista/xp con 2008 e copiare l'exe sulla macchina Win7. – JMarsch

+0

Ottimo suggerimento. Grazie. –

risposta

87

Sembra che i contatori delle prestazioni siano stati danneggiati sul mio sistema. Sebbene non abbia seguito esattamente lo this post, mi ha portato alla soluzione. Ecco quello che ho fatto:

In un prompt dei comandi con l'amministratore/elevare i privilegi digitate quanto segue:

lodctr /? 

roba utile in là ...

Poi digitato:

lodctr /R 

Secondo i documenti del passaggio precedente, questo ottiene Windows a ricostruire le stringhe perf Perfection del Registro di sistema e le informazioni da zero in base alle impostazioni del Registro di sistema corrente e b file INI ackup. Ho la sensazione che questo è ciò che ha fatto la magia. Tuttavia, dopo ho notato che i contatori delle prestazioni di .NET non ci fosse più così basano su this ho digitato il seguente per ricaricare loro:

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

Nota che questo percorso è per il .NET Framework 4.0 su x64. Puoi immaginare il percorso per altre varianti del framework/piattaforma. Sono indovinando dovresti sempre caricare i contatori dalla versione più alta del framework .NET che hai installato, ma questa è solo un'ipotesi.

Spero che questo aiuti qualcun altro un giorno!

+2

Lordo! Ma grazie per averci fatto sapere :-) – KiNgMaR

+1

La tua speranza è stata soddisfatta. ;) Grazie per questo!!! – valveLondon

+1

C'è qualche idea su cosa provoca questo? – JeremyK