FxCop,组成依赖程序集的调用者列表
Posted
技术标签:
【中文标题】FxCop,组成依赖程序集的调用者列表【英文标题】:FxCop, compose list of callers from dependent assembly 【发布时间】:2011-09-23 07:54:52 【问题描述】:我正在构建一些自定义 FxCop 规则,其中一个规则需要强制在特定方法中调用构造函数。为此,我需要在执行实际测试之前为该特定构造函数创建一个调用者列表。这怎么可能?是否有某种句柄可以获取 ApplicationDomain 中所有已加载程序集的列表,我可以在其中遍历类并找到构造函数 Method 对象?理想情况下,调用者列表应由 BeforeAnalysis 方法组成。
【问题讨论】:
【参考方案1】:Microsoft.FxCop.Sdk.CallGraph.CallersFor(Method) 方法可能会满足您的需求。但是,您似乎描述的一般方法很少是一个好主意,因为它通常会将问题分配给错误的目标。例如,在您描述的场景中,可能需要将问题归因于应该但不包含目标构造函数调用的方法。但是,如果您的分析目标是构造函数,则检测到的问题将归因于构造函数,而不是应该调用它的方法。
【讨论】:
【参考方案2】:我想我没有很好地解释这个问题,但我明白你的意思。 我有 3 个不同的程序集,对于从一个程序集到另一个程序集的某些方法调用,我需要确保调用了基准构造函数。基准类位于第 4 个程序集中。现在我的问题是只有 VS2010 只加载一个目标程序集进行分析,当我使用 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 中完美运行。
【讨论】:
以上是关于FxCop,组成依赖程序集的调用者列表的主要内容,如果未能解决你的问题,请参考以下文章
GNU gcc/ld - 使用在同一个目标文件中定义的调用者和被调用者包装对符号的调用