2009-10-08 95 views
33

我有一個在VS2008和Vista上正常工作的程序,但是我在Windows 7和VS2010/.NET Framework 4.0上試用它,它不工作。最終問題是System.Diagnostics.PerformanceCounterCategory.GetCategories()(和其他PerformanceCounterCategory方法)不起作用。我收到System.InvalidOperationException異常消息「無法加載計數器名稱數據,因爲從註冊表中讀取了無效索引」。.NET 4.0和Windows 7 PerformanceCounters

我可以用下圖所示的非常簡單的程序重現此:

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

如果你不知道它的Windows VS .NET版本,你可以嘗試在VS改變項目性質爲目標.NET 3.5,重建,然後再試一次。 或者您可以在2008年的vista/xp機器上創建相同的代碼,並將exe複製到Win7機器上。 – JMarsch 2009-10-08 22:54:05

+0

偉大的提示。謝謝。 – 2009-10-08 23:38:15

回答

87

似乎性能計數器在我的系統上損壞。儘管我沒有完全按照this post的規定,但它讓我找到了解決方案。下面是我做的:

與管理員的命令提示符/提升權限鍵入以下內容:在那裏

lodctr /? 

有用的東西......

然後鍵入:

lodctr /R 

根據上一步的文檔,這將獲取windows到根據當前註冊表設置重新生成perf註冊表字符串和信息ackup INI文件。我有一種感覺,這是什麼魔術。不過,接下來我注意到了.NET性能計數器不存在了,所以基於this我鍵入以下重新加載它們:

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

注意,這條道路是在x64的.NET Framework 4.0。您可以想象其他變體框架/平臺的路徑。我是猜測您應該始終從您安裝的.NET框架的最高版本加載計數器,但這只是一個猜測。

我希望這有助於別人有一天!

+2

毛!但是,謝謝你讓我們知道:-) – KiNgMaR 2009-10-08 23:08:40

+1

你的希望已經實現。 ;)感謝這! – valveLondon 2012-02-24 23:31:19

+1

有什麼想法導致這種情況發生? – JeremyK 2012-03-05 14:17:58