0

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

4

2 回答 2

0

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

于 2011-09-27T12:50:10.393 回答
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 上完美运行。

于 2011-09-28T08:05:48.473 回答