【问题标题】:Methods referenced by other assemblies其他程序集引用的方法
【发布时间】:2011-05-04 11:55:58
【问题描述】:

我正在开发一种影响分析工具。如果我在 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 并且会受到影响。

任何帮助将不胜感激

【问题讨论】:

    标签: c# .net assemblies reference system.reflection


    【解决方案1】:

    您需要分析这些程序集中的所有代码。您可以使用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 ;-)
                }
            }
        }
    }
    

    【讨论】:

    • @Daniel:非常感谢您的建议。我正在尝试,很快就会更新。
    • @Daniel:经过一些更改(非常具体到我的要求),它起作用了。非常感谢。你摇滚。
    • @Shwetabh:很高兴听到这个消息!您介意分享我的建议中缺少的部分,即真实分析吗?
    • @Daniel:正如我所说,这非常符合我的要求。让您知道: 1. 我已经在迭代所有 dll(数量为 100)。 2. 然后通过我上面的代码,我得到了所有引用我的程序集的程序集。 3. 一旦我得到上面所说的 10 个程序集,然后通过传递目录和选择的程序集全名来使用代码来获取指令。 4. 然后在分析部分(最难的部分)我只是在寻找我的方法名称(字符串操作)。就是这样。
    • @Shwetabh:感谢您的更新。您知道,如果在不同的类中存在多个具有相同名称的方法,这将导致误报?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2017-10-25
    相关资源
    最近更新 更多