1

複数のアセンブリで、特定のメソッドの上流の呼び出し元をすべて見つけたいと思います。

レイト バインド参照や仮想メソッド呼び出しを解決する必要はありません。シンプルで直接的な CILcall参照で問題ありません。

私はいくつかのオプションを見てきました:

  • Reflector: ツールの Analyzer 部分は、拡張ポイントとして公開されていません。
  • FxCop:CallGraphクラスを実行するには、FxCop コンテキストが必要です。
  • Roslyn: どこから始めればいいのかわかりませんが、とにかくソースから始めることに興味はありません。アセンブリを提供して、代わりにバイトコードとメタデータを操作したいと考えています。
  • VS アドイン: Reflector と同様に、Call Hierarchy ツールはアドインに公開されません。

私の唯一の解決策は、アセンブリ内のすべてのメソッドを反復処理callし、ソース メソッドへの命令を探し、呼び出し元メソッドごとにプロセスを再帰的に繰り返すことです。

私の提案した解決策が進むべき道であると仮定すると、それを行うための最良の方法は何ですか? MethodInfo.GetMethodBody().GetILAsByteArray()少しハードコアなようです。CIL の操作を簡単にするライブラリはありますか (ASM for Java など)。

4

2 に答える 2

2

モノセシルを使用できます。この目的では、メソッド本体も解析することを除いて、基本的にリフレクションと同じです。

これを行うためのコードのスケッチ:

var assembly = AssemblyDefinition.ReadAssembly(assemblyPath);
var methods = from module in assembly.Modules
              from type in module.Types
              from method in type.Methods
              from instruction in method.Body.Instructions
              where instruction.OpCode == OpCodes.Call
                    || instruction.OpCode == OpCodes.Callvirt
              let calledMethod = (MethodReference)instruction.Operand
              where calledMethod.DeclaringType.Name == givenMethodTypeName
                    && calledMethod.Name == givenMethodName
              select method;
于 2013-09-13T22:59:28.217 に答える