FxCop,从依赖程序集组成调用者列表

时间:2011-09-23 07:54:53

标签: fxcop static-code-analysis

我正在构建一些海关FxCop规则,其中一条规则需要强制执行在特定方法中调用构造函数。为此,我需要在执行实际测试之前为该特定构造函数创建一个调用者列表。这怎么可能?是否有某种句柄来获取ApplicationDomain中所有已加载程序集的列表,我可以在其中迭代这些类并找到构造函数Method对象?理想情况下,调用者列表应该在BeforeAnalysis方法中组成。

2 个答案:

答案 0 :(得分:0)

Microsoft.FxCop.Sdk.CallGraph.CallersFor(Method)方法可以为您提供所需的内容。但是,您似乎描述的一般方法很少是一个好主意,因为它通常会将问题分配给错误的目标。例如,在您描述的场景中,可能希望将问题归因于应该但不包含目标构造函数调用的方法。但是,如果您的分析目标是构造函数,则检测到的问题将归因于构造函数,而不是应该调用它的方法。

答案 1 :(得分:0)

我想我没有很好地解释这个问题,但我明白你的观点。 我有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。