【问题标题】:How can I test the backward compatibility of API between .net assemblies如何测试 .net 程序集之间 API 的向后兼容性
【发布时间】:2011-11-26 15:02:30
【问题描述】:

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

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

建议的工具只能比较两个程序集并说明 API 中是否可能存在重大更改,但不能说明最新 API 是否真的破坏了使用它的旧程序集。 我想找到一个工具或编写一个测试来检查每个旧 dll 是否可以与我的新 API dll 一起使用。

至于 API 的更改,我很可能只会对其进行扩展,但即使它仍然会破坏旧程序集中的代码。可以在此处找到此类更改的一些示例:

目前我看到的唯一解决方案是使用最新的 API 编译旧程序集的源代码,但我想只使用程序集并将它们添加为我的单元测试的一部分。有没有更好的方法可以解决这个问题?

编辑:

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

【问题讨论】:

  • 这可能是我缺乏理解,但我不明白你正在寻找的工具可以做得更好或更容易,只是编译组合源。我的意思是,该工具还需要旧资源和新资源,以便能够按照您的意图分析重大更改,不是吗?也许你可以填写我。
  • @GertArnold 我已经更新了我的问题,我想自动化这个过程,所以手动编译源代码或手动运行工具可能不太方便

标签: c# api backwards-compatibility


【解决方案1】:

您想要做的是做一个差异并生成一个重大更改列表。然后,您想搜索您的程序集是否确实使用了任何损坏的 API。您可以使用 ApiChange 工具执行此操作,以进行差异并找到任何受影响的用户。

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

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

编辑1:

我只是忘记了:ApiChange 工具实际上已经有您感兴趣的functionality。这是选项

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

我们确实在我们的部门使用它并取得了良好的效果。唯一的问题是 XML Intellisense 文件。如果另一个目标不使用已删除的方法,但在 XmlDoc 中引用它,编译器将写入一个警告,指出引用了不存在的方法。这很难捕获,并且还涉及解析智能感知文档文件。但这是一个非常极端的案例。

【讨论】:

  • 如果我添加一个新的重载会导致在使用我的 API 的程序集中的方法调用出现歧义,这种方法是否有效?
  • 编译器的歧义不会被破坏。我假设您想找到需要重新编译的重大更改。在重新编译期间可能会使用一些其他方法而不是以前,但是已经构建的目标应该能够使用它们已经链接的方法。如果您还想添加此类支持,则需要实现部分 ECMA C# 规范来处理方法重载以及 C# 编译器如何解决它们。
  • 谢谢,我刚刚测试了我在第一条评论中描述的案例,效果很好
【解决方案2】:

我花了一天的时间四处寻找这个问题的答案。似乎相关(无济于事的关闭)问题中引用的工具现在已死或一样好。但是我刚刚查看了 Telerik 的汇编差异工具 JustAssembly,这看起来比滚动自己的要好得多,如果您查看他们的库,这似乎是一大堆工作,并且可能会出错。

他们有一个 UI,从集成到您的 CI 构建的角度来看并没有太大帮助,它非常基本,但是您可以从源代码构建库,我刚刚完成了该库和库看起来它拥有您快速启动和运行所需的一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2011-04-07
    • 2011-10-28
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多