33

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/デバッガーを接続して実行するかどうかは関係ありません。テストする Windows 7 または VS2010 を搭載した別のマシンがないため、どちらが複雑になっているのか (またはその両方) がわかりません。これは Windows 7 x64 であり、アプリを x32 と x64 の両方で強制的に実行しようとしましたが、同じ結果が得られました。

4

1 に答える 1

86

システムのパフォーマンス カウンターが破損しているようです。この投稿に正確に従ったわけではありませんが、解決策につながりました。これが私がしたことです:

管理者/昇格権限のあるコマンド プロンプトで、次のように入力します。

lodctr /?

便利なものが入っている...

次に入力しました:

lodctr /R

前の手順のドキュメントによると、これにより、現在のレジストリ設定とバックアップ INI ファイルに基づいて、Windows が perf レジストリ文字列と情報を最初から再構築します。これが魔法のような気がします。ただし、次に .NET パフォーマンス カウンターが存在しないことに気付いたので、これに基づいて次のように入力して再読み込みしました。

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

このパスは、x64 上の .NET Framework 4.0 用であることに注意してください。フレームワーク/プラットフォームの他のバリエーションへの道を想像することができます。インストールした .NET Framework の最新バージョンから常にカウンターをロードする必要があると思いますが、それは単なる推測です

これがいつか他の誰かに役立つことを願っています!

于 2009-10-08T22:52:51.107 に答える