0

影響分析用のツールを開発しています。myAssembly で「myMethod」というメソッドを変更する場合、myAssembly を参照する他のすべてのアセンブリを取得する必要があり、以下のコードで取得しました。

Assembly a = Assembly.LoadFrom("otherAssembly");
//check if the my Assembly is referenced or not?
if (a.GetReferencedAssemblies().Where(item => item.Name == "myAssembly").LongCount() > 0)
{
    //Do something
}

しかし、ここで「myAssembly」の「myMethod」が呼び出されている/使用されているかどうかを知るにはどうすればよいですか? そうしないと、myAssembly を参照している他のすべてのアセンブリを取得します (たとえば、10 個) が、10 個のうち 1 個だけが呼び出され、myMethod が使用され、影響を受けます。

どんな助けでも大歓迎です

4

1 に答える 1

2

これらのアセンブリ内のすべてのコードを分析する必要があります。このタスクにはMono.Cecilを使用できます。

追加情報:
あなたがやろうとしていることは、まったく些細なことではありません。実行可能なすべてのコードを反復処理し、CIL 命令を調べて分析し、メソッドが呼び出されているかどうかを確認する必要があります。
出発点として、次のようなすべてのメソッドの指示を取得できます。

var assemblyResolver = new DefaultAssemblyResolver();
assemblyResolver.AddSearchDirectory(...);
var assemblyDefinition = assemblyResolver.Resolve(
                             AssemblyNameReference.Parse(fullName));
foreach(ModuleDefinition module in assemblyDefinition)
{
    foreach(TypeDefinition type in module.Types)
    {
        foreach(MethodDefinition method in type.Methods)
        {
            foreach(Instruction instruction in method.Body.Instructions)
            {
                // Analyze it - the hard part ;-)
            }
        }
    }
}
于 2011-05-04T12:00:46.713 に答える