我正在寻找任何自动方式来检查C#DLL版本之间的二进制不兼容。
类似于Unix C ++的abi-compliance-checker
,但是对于.NET,尤其是对于C#,将是很棒的。此abi-compliance-checker
给出了我希望获得的有关两种不同版本的C#API的信息的屏幕截图。
如果没有任何直接等效项,那么完全获取有关any自动方法的任何信息也将很有帮助,以确保库版本之间的二进制兼容性不会被破坏。
SO answer似乎是堆栈溢出中破坏API的权威列表。还有This question讨论了其中一些问题。 (当然,Internet上对此问题还有许多其他讨论;尽管有很多讨论集中在C ++上,而不是C#和.NET上,这是我在这里要问的。)
除其他事项外,这些文章有助于明确说明:
二进制(不兼容)并不总是需要编译(不兼容),反之亦然
存在不同程度的不兼容:特别是,有些晦涩的事情,特别是与反射有关,库的用户可以这样做,这会使某些API更改与二进制不兼容,而在其他情况下则不会
因此,考虑到如今每个人都应该使用语义版本控制来更新其API,并且还考虑到每个人都在使用测试套件,甚至还有开发人员,那么每个人-甚至每个人都怎么样? -自动测试.NET中的二进制不兼容更改?
我可以看到,仔细使用测试套件就足以让您知道是否进行了编译兼容性更改,并且大多数项目已经具有此功能-因此,为什么我的问题是关于二进制不兼容性更改的,而这似乎并没有可以在我查看或从事的任何项目中自动检测到。
仅阅读以上文章并注意可能还不够……(尽管这是某种开始),但是我找不到任何其他方法的文档。
作为对我自己问题的非常部分的回答,并且在某种基础上总有总比没有好。在我看来,这似乎是一个可能的实用答案(即,它肯定不会解决所有可能的问题,但应该至少要抓住一些……)将是存储旧测试套件的编译版本,然后检查它们是否仍针对已编译的API新版本运行。
我假设这是某种答案,因为在我从事的大多数OSS项目中,测试和库是同时编译的;因此,在这样的项目中,仅以二进制不兼容的方式(即二进制而不是编译不兼容)的任何事物都不会以正常方式运行正常测试而导致失败。但是我建议的内容至少会出现一些此类问题。
所以我不只是说“拥有测试套件”来回答我的问题!我建议的一件事,与我通常认为的测试套件所做的不同,可以解决我所要解决的问题。