How can I test the backward compatibility of API between .net assemblies
我有一个提供API的程序集,它被其他程序集使用。我需要验证新版本的api dll是否仍然与使用旧版本api的旧程序集兼容。
我发现了几个同样的问题,但没有解决我问题的答案:
- 用于验证公共API兼容性的工具
- 用于C/.NET API向后兼容的工具
建议的工具只能比较两个程序集,并说明是否可能破坏API中的更改,但如果最新的API确实破坏了使用它的旧程序集,则不能。我想找到一个工具或编写一个测试,可以检查每个旧的DLL是否可以使用我的新API DLL。
至于API中的更改,我更可能只扩展它,但即使它仍然可以在旧的程序集中破坏代码。这些变化的一些例子可以在这里找到:
- .NET中API中断更改的明确指南
- .NET:关于assemblyversion,什么定义了二进制兼容性?
目前,我看到的唯一解决方案是用最新的API编译旧程序集的源代码,但我只想用程序集进行编译,并将它们作为单元测试的一部分添加。我有更好的办法来处理吗?
编辑:
我正在寻找一个工具,可以自动验证.NET程序集之间的向后兼容性。(命令行或使用一些API)
您要做的是执行diff并生成中断更改的列表。然后,您要搜索您的程序集是否使用了任何中断的API。您可以使用apichange工具来完成这项工作,以进行差异化,并找到任何受影响的用户。
使之更具体。如果您已经从接口中删除了一个方法,那么您需要在使用接口方法的类或任何实现此方法的类中查找此方法的所有实现者和用户。
apichange可以在命令行上使用命令-whoimplementsinterface和-whousemethod搜索特定方法的实现者和用户。它不是在命令行自动执行的,但是您可以直接使用apichange.api.dll来自动执行这个查询。
Eddi1:
我只是忘记了:apichange工具实际上已经有了您感兴趣的功能。这是选项
-ShowrebuildTargets -new -old [-old2 ] -searchin
我们在部门使用过,效果很好。唯一能找到的就是XML IntelliSense文件。如果另一个目标不使用删除的方法,但在xmldoc中引用了该方法,则编译器将编写一条警告,指出引用了一个不存在的方法。这很难理解,而且还需要解析intellisense docu文件。但这是一个非常边缘的情况。
我花了一天时间四处寻找答案。似乎相关问题上引用的工具(无帮助地关闭)现在已经失效,或与相同。但我刚刚看了一下Telerik的组装差异工具just assembly,这看起来比滚动自己的要好多了,如果你看他们的库,这看起来像是一堆工作,可能会出错。
他们有一个用户界面,从集成到你的CI构建的角度来看,它没有那么大的帮助,这是非常基本的,但是你可以从源代码构建库,我刚刚完成了这个库,看起来它拥有了你需要的一切,可以让你自己快速启动和运行。