0

Intel Inspector で複雑な .net/COM アプリケーションをテストしています (ネイティブ メモリ リーク)。.net コードのかなりの場所で、COM オブジェクトへの参照を静的フィールドにキャッシュしています。明らかに、インスペクターはそれらにリークとしてフラグを立てています。いくつかのケースでは、抑制を追加するだけで十分ですが、フラグが設定された (メイン COM オブジェクトの一部として作成された) オブジェクトの数が制御不能 (数百) になることがあり、それらを抑制すると、実際のリークである同様のパターンが隠される場合があります。簡単に言うと、プロセスが終了する直前に、appdomain にロードされたすべてのアセンブリのすべてのクラスを反復処理し、COM オブジェクトを参照している静的フィールドを null に設定しています。COM オブジェクトを参照するすべての静的フィールドを有効なキャッシュとしてまだ受け入れられていなくても (そして実際のリークである可能性があります) 印刷できれば、今後の使用に最適です。

ただし、タイプが使用されていない場合は、(null かどうかを確認するために) getField を呼び出しているときに静的コンストラクターが実行され、さらに COM オブジェクトが作成される可能性があります。タイプが現在の AppDomain で使用されたことがあるかどうかを検出する方法はありますか?

4

1 に答える 1

0

自動的にできるとは思いませんが、静的コンストラクターに自分自身を登録させることができます。したがって、アセンブリ内のすべてのクラスを反復処理する代わりに、登録されているすべてのクラスを反復処理します。

public static class ClassRegistrar
{
    private static List<Type> registered = new List<Type>();
    public static void Register(Type type)
    {
        registered.Add(type);
    }
    public static IEnumerable<Type> Registered
    { get { return registered; } }
}

public class MyClass
{
    static MyClass()
    {
        ClassRegistrar.Register(typeof(MyClass));
    }
}
于 2013-03-03T11:12:33.237 に答える