2011-11-26 69 views
6

我有一个程序集提供了一个API并被其他程序集使用。我需要验证更新版本的API dll是否仍然与使用较早版本的API的旧程序集兼容。我如何测试.net程序集之间API的向后兼容性

我发现一对夫妇的是问同样的问题,但目前还没有答案,是解决我的问题:

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

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

现在我看到的唯一的解决办法是编译旧组件的源代码与最新的API ,但我只想用程序集做它,并将它们添加为我的单元测试的一部分。有没有更好的办法可以处理?

编辑:

我正在寻找一个工具,可以自动验证.NET程序集之间的向后兼容性的过程。 (命令行或带有一些API)

+1

这可能是我缺乏理解,但我没有得到你正在寻找的工具可以做得更好或更容易,只是编译组合的来源。我的意思是,这个工具既需要新旧来源,也能按照你打算的方式分析重大变化,不是吗?也许你可以填补我 –

+0

@GertArnold我已经更新了我的问题,我想自动化这个过程,所以手动编译源代码或手动运行工具可能不是很方便 – username

回答

9

你想要做的是做一个差异并生成重大变化的列表。然后你想搜索你的程序集是否使用任何破坏的API。你可以使用ApiChange工具来做这个比较,并找到它的任何受影响的用户。

使其更具体。如果您从接口中删除了一个方法,那么您需要在使用接口方法或任何实现此方法的类的类中找到此方法的所有实现者和用户。

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

EDIT1:

我只是忘了:在ApiChange工具实际上有functionality你有兴趣了。它是选择

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

我们没有在我们收到了良好效果部门使用它。唯一的问题是XML Intellisense文件。如果另一个目标不使用已移除的方法,而是在XmlDoc中引用它,编译器将会写入一个警告,指出引用了一个不存在的方法。这很难被捕获,并且还涉及到解析intellisense docu文件。但这是一个很有边缘的案例。

+0

如果我使用这种方法会添加一个新的重载,可能导致在使用我的API的程序集中的方法调用中出现歧义? – username

+0

编译器模糊不会中断。我假设你想找到需要重新编译的重大更改。可能发生的情况是,在重新编译期间会使用比以前更多的其他方法,但已经构建的目标应该能够使用它们已经链接的方法。如果你想添加这样的支持,你需要实现部分ECMA C#规范来处理方法重载以及C#编译器如何解决它们。 –

+0

谢谢,我刚刚测试了我在第一条评论中描述的情况,它工作正常 – username