0

私はいくつかのカスタム FxCop ルールを作成していますが、そのうちの 1 つはコンストラクターが特定のメソッドで呼び出されるようにする必要があります。そのためには、実際のテストを実行する前に、その特定のコンストラクターに対する呼び出し元のリストを作成する必要があります。これはどのように可能ですか?ApplicationDomain にロードされているすべてのアセンブリのリストを取得するためのハンドルはありますか?クラスを反復処理して、コンストラクターの Method オブジェクトを見つけることができますか? 理想的には、BeforeAnalysis メソッドで呼び出し元のリストを構成する必要があります。

4

2 に答える 2

0

Microsoft.FxCop.Sdk.CallGraph.CallersFor(Method) メソッドは、必要なものを提供する場合があります。ただし、あなたが説明しているように見える一般的なアプローチは、通常、問題を間違ったターゲットに割り当てるため、めったに良い考えではありません。たとえば、説明したシナリオでは、ターゲット コンストラクター呼び出しを含むべきであるが含まないメソッドに問題があると考えることがおそらく望ましいでしょう。ただし、分析対象がコンストラクターの場合、検出された問題は、コンストラクターを呼び出したはずのメソッドではなく、コンストラクターに起因するものになります。

于 2011-09-27T12:50:10.393 に答える
0

質問をうまく説明できていないと思いますが、あなたの言いたいことはわかります。3 つの異なるアセンブリがあり、あるアセンブリから別のアセンブリへの特定のメソッド呼び出しについて、ベンチマーク コンストラクターが呼び出されることを確認する必要があります。ベンチマーク クラスは 4 番目のアセンブリにあります。ここで私の問題は、VS2010 のみが分析のために 1 つのターゲット アセンブリのみをロードし、CallGraph を使用してコンストラクターを呼び出すメソッドのリストを作成したときに、何も見つからないことでした。FxCopCmd.exe を手動で呼び出す場合、/file: パラメータを使用して、依存アセンブリを手動で追加することができます。

私の解決策は、さまざまなアセンブリを手動でロードすることです (RuleUtilities.AnalysisAssemblies でロードされたアセンブリに依存せず、BeforeAnalysis メソッドで呼び出し元のリストを作成します。

            RuleUtilities.GetAssembly(
            RuleUtilities.AnalysisAssemblies
            .First().Directory + "\\" + additionalAssemblyFilename)
            .Types.SelectMany(type => type.Members)
            .Where(member => member.IsPublic)
            .Where(CanBeCastedToMethod)
            .Cast<Method>()
            .SelectMany(CallGraph.CallersFor);

このアプローチにより、各アセンブリとベンチマーク クラス コンストラクターの呼び出し元のリストを作成できます。VS2010で完全に動作します。

于 2011-09-28T08:05:48.473 に答える