如何在API中获取被调用方法的列表

时间:2012-10-01 15:23:07

标签: c# api static-analysis

简而言之:我需要获取我们的数据库API的方法列表,这些方法实际上是在我们的代码库中调用和使用的。

长: 我们有一个非常大的代码库,它基于(丑陋的)数据库API。后者有很多接口和很多功能,我们根本不需要它们,我们想要摆脱它。重写的第一个原型应该是与现有API代码兼容的一百个原因 - 因此应该实现它的接口,以便根据我们的生产代码轻松构建它。

要定义我们使用的方法子集,我可以使用dotCover或其他方法进行一些覆盖率分析并运行我们的单元测试,但我确信这只会产生80%到90%的成功率。我需要的更像是对代码的静态分析。另一种方法可能是api的动态包装器,它记录每个方法调用,在一些使用后进行适当的覆盖分析。

我很好奇是否可以使用工具进行此类分析,或者我是否应该包装API以获取所需的信息(手动/自动?它真的很大,有数百或数千种方法)。

提一下:我可以完全访问所有来源,但是他们使用自己的解决方案在很多模块中进行分发。

2 个答案:

答案 0 :(得分:2)

正如Chris所做的那样,NDepend可以为您提供一个名为API方法/字段/类型的列表。 免责声明:我是该工具的开发人员之一。

下面的NDepend dependency structure matrix屏幕截图显示,在NUnit代码库中,只有程序集nunit.uiexcepion (行/列#6)nunit.core.interfaces (行/列#18)正在使用方法List<T>.ToArray()

我们称之为第三方代码(您所谓的 API称为),以蓝色字体显示。仅显示使用的API方法/字段/类型 。例如,在屏幕截图中,未显示类HashSet<T>,因为NUNit代码库未使用它。

NDepend的所有功能都考虑了第三方代码,但我在这里公开了依赖结构矩阵,因为它肯定是获取的最合适的功能API中的被调用方法列表。该工具的14天全功能试用版为available for download

NDepend dependency structure matrix

让我们注意,当您比较代码库的2个不同快照时,NDepend也可以显示what third-party code is not used anymore, or was not used and is now used。在下面的屏幕截图中,我们可以看到NUnit v2.5.3使用的第三方方法,NUnit v2.5.3没有使用这些方法。

NDepend search methods by change

答案 1 :(得分:1)

我将看一下用于在.NET之上创建面向方面编程(AOP)层的各种IL-weaver实现中的任何一个 - PostSharp很容易让人想到:

http://www.sharpcrafters.com/solutions/logging#

如果我是你,我会创建一个“类似记录器”的方面,然后将该方面编织到您想要编目的所有方法中。然后,通过它的步伐运行一段时间。您应该能够以这种方式收集一组良好的使用数据,这有助于确定您可以安全摆脱的内容。

这种方法相对于任何数量的静态分析工具的一个好处是,它还捕获任何“动态”或元调用方法 - 而不仅仅是编译时绑定调用。