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

2023-12-24

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

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

  • 验证公共 API 兼容性的工具 https://stackoverflow.com/questions/3090792/tool-to-verify-compatibility-of-a-public-apis
  • C#/.NET API 向后兼容工具 https://stackoverflow.com/questions/2377855/tool-for-backwards-compatibility-for-the-c-net-api

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

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

  • .NET 中 API 重大更改的明确指南 https://stackoverflow.com/questions/1456785/a-definite-guide-to-api-breaking-changes-in-net
  • .NET:关于 AssemblyVersion,什么定义了二进制兼容性? https://stackoverflow.com/questions/768832/net-with-respect-to-assemblyversion-what-defines-binary-compatibility

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

edit:

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


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

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

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

Edit1:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测试 .net 程序集之间 API 的向后兼容性 的相关文章

  • 强制枢轴项目在显示之前预加载

    我有一个带有多个 PivotItems 的 Pivot 其中一个包含一个画布 将其项目放置在动态位置 取决于数据 我获取数据 并且可以在用户选择该项目之前将这些项目放置在其位置 这不是第一个枢轴 但是 只有当我选择 PivotItem 时
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 使用 ITextSharp 从内存流附加 PDF 文件时遇到问题

    我在附加内存中创建的 PDF 文件并将其附加到电子邮件模板时遇到问题 电子邮件没有任何问题 但没有附件 我不明白为什么会发生这种情况 这是该过程的完整代码 ExtendedEmailTemplate emailTemp new Extend
  • Fortran DLL 导入

    Fortran 中有一段代码罗伯特 L 帕克和菲利普 B 斯塔克 http www stat berkeley edu 7Estark Code sbvq f FORTRAN subroutine bv key m n a b bl bu
  • 从 Web 浏览器控件读取 Javascript 变量

    我正在尝试读取从表单上的 WebBrowser 控件加载和调用的 Javascript 变量的值 Example index html 引用名为 test js 的 javascript 在 test js 上 创建并填充了几个变量 然后i
  • 将二进制文件内容读取到 std::string 的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将 istream 与字符串一起使用 https stackoverflow com questions 6510923 how to use istream with strings std i
  • .NET 4.0 进程中的 clr.dll!LogHelp_TerminateOnAssert

    背景 我正在开发一个基于 WinForm 的 NET 4 0 桌面应用程序 该应用程序几乎没有线程和计时器 并对用户控件使用一些 GDI 处理 在我的开发过程中 我通常会查看 sysinternal 的 Process Explorer 以
  • 保存到会话状态的 DataTable 丢失事件处理程序

    我有一个来自强类型数据集的数据表 该数据集在 TableNewRow 事件上有一个事件处理程序 用于初始化一些日期字段 当我将此表保存到会话状态时 事件处理程序会正常触发 直到表被序列化 在后续请求中 当我从会话状态检索表时 事件处理程序不
  • 无法将 User32.dll 导入 Visual Studio

    I tried To add 用户32 dll from 参考管理器 并将其导入自Windows System32 user32 dll I got 错误信息 无法添加对 C Windows System32 user32 dll 的引用
  • FileMode 和 FileAccess 以及 IOException:进程无法访问文件“filename”,因为它正在被另一个进程使用

    我有一个应用程序 A 它生成一个用于跟踪的文本文件 同时 应用程序 B 需要读取相同的文本文件并附加在邮件消息中 但当应用程序 B 尝试读取文本文件时 出现以下错误 IOException 进程无法访问文件 filename 因为它 正在被
  • std::function 中参数的自动动态转换

    我们有多态类 A 和 B 例如 struct A virtual A struct B final public A void f std cout lt lt f lt lt std endl 我想分配一个变量std function
  • 将模型和订阅密钥传递给 LuisDialog,而不是通过属性

    我正在编写一个可以说两种语言的机器人 因此 我需要使用两个单独的 LUIS 应用程序 每种语言一个 Bot Framework 中的 LuisDialog 是这样初始化的 来自 Microsoft 的示例 LuisModel c413b2e
  • 底层连接已关闭:接收时发生意外错误

    我来这里是因为我在通过 ftp 协议下载一些文件时遇到问题 这很奇怪 因为它偶尔会发生 甚至对于同一个文件也是如此 只是一个精确度 我正在下载非常大的文件 从 500 Mo 到 30Go 以下是我的函数返回的异常类型 抱歉 这是法语 Sys
  • 如何使用 PostSharp 拦截基类上的方法调用?

    我想提供一个实现System Object ToString使用 PostSharp 到各种类 我创建了一个继承自的方面MethodInterceptionAspect但是OnInvoke调用时不会调用方法EchoDto ToString发
  • C++ boost asio超时用于阻止连接

    我有一个 C boost 客户端 它执行阻塞连接并在收到响应后处理消息 我面临一个奇怪的问题 tcp resolver query query tcp v6 this gt host port tcp resolver query v4 m
  • Caliburn.Micro 事件聚合器

    如果这是一个非常愚蠢的问题 请道歉 但我刚刚开始使用 caliburn micro 我正在努力获取 eventAggregator 似乎没有任何内容订阅 我不确定问题是出在视图模型还是引导程序上 这是视图模型 class MainWindo
  • 如何在 C# 中按进程获取打开文件句柄的列表?

    如何在 C 中通过进程 ID 获取打开文件句柄的列表 我也有兴趣挖掘并获取文件名 寻找与流程资源管理器所做的等效的编程 这很可能需要互操作 考虑到对此添加赏金 实现起来非常复杂 哎呀 这很难从托管代码中做到 有一个 大多数事情都可以在互操作
  • C++ 中的无符号双精度?

    为什么 C 不支持无符号双精度语法 因为典型的浮点格式不支持无符号数 例如 参见此 IEEE 754 格式列表 http en wikipedia org wiki IEEE 754 2008 Formats 添加通用硬件不支持的数字格式只
  • C#无循环方式将字符串拆分为多维数组或锯齿状数组

    如何在不循环的情况下将字符串拆分为多维数组或锯齿状数组 我看到一个代码片段 其中有人使用文件流执行此操作 但我不知道如何使其适用于我的字符串 我的字符串类似于1 2 3 1 4 1并可以分为ID Qty 这是我看到的代码 string li
  • 用 C# 解析和查询 SOAP

    我正在尝试解析一个大量命名空间的 SOAP 消息 源也可以在here http tinyurl com n3av6k

随机推荐