C# · 12月 25, 2021

c# – 如何测试.net程序集之间API的向后兼容性

我有一个提供API的程序集,并由一些其他程序集使用.我需要验证较新版本的API dll是否仍然与使用旧版API的旧程序集兼容.

我发现了几个问同样的问题,但没有解决问题的答案:

> Tool to verify compatibility of a public APIs
> Tool for backwards compatibility for the C#/.NET API

建议的工具只能比较两个程序集,并说明API中是否存在可能的重大更改,但如果最新的API确实破坏了使用它的旧程序集,则不会.
我想找一个工具或编写一个能够检查每个旧dll是否可以使用我的新API dll的测试.

至于API的变化,我更有可能只扩展它,但即使它仍然可以破坏旧程序集中的代码.这些变化的一些例子可以在这里找到:

> A definite guide to API-breaking changes in .NET
> .NET: with respect to AssemblyVersion,what defines binary compatibility?

现在,我看到的唯一解决方案是使用最新的API编译旧程序集的源代码,但我想只使用程序集并将它们作为单元测试的一部分添加.有什么更好的方法可以处理吗?

编辑:

我正在寻找一种能够自动验证.net程序集之间向后兼容性的过程的工具. (命令行或者也有一些api)

解决方法 你想要的是做一个差异并生成一个突破性的变化列表.然后,您想要搜索您的程序集是否使用任何损坏的API.您可以使用ApiChange工具执行此操作以执行差异并查找其受影响的任何用户.

使其更具体.如果已从接口中删除方法,则需要在使用接口方法的类或任何实现此方法的类中查找此方法的所有实现者和用户.

ApiChange可以使用命令-whoimplementsinterface和-whousesmethod在命令行上搜索特定方法的实现者和用户.它不是在命令行自动执行,但您可以直接使用ApiChange.Api.dll自动执行此查询.

EDIT1:

我忘记了:ApiChange工具实际上已经有你感兴趣的functionality了.这是选择

-ShowrebuildTargets -new -old [-old2 ] -searchin

我们确实在我们的部门使用它,效果很好.唯一的问题是XML Intellisense文件.如果另一个目标不使用已删除的方法但在XmlDoc中引用它,编译器将写入一个警告,表明引用了一个非现有方法.这很难捕获并且还涉及解析intellisense docu文件.但这是一个非常有利的案例.