【问题标题】:Determining why binary compatibility is broken确定二进制兼容性被破坏的原因
【发布时间】:2013-03-24 04:15:53
【问题描述】:

当我尝试重建我的一个 VB6 DLL 时,我收到一条警告:

"二进制兼容性 DLL 或 EXE 包含参数类型或 找不到定义的返回类型”

我必须在选定的 DLL 中发布一些更改(方法内部的简单更改 - 根据 this 没有任何破坏兼容性)

我遵循的普遍接受的方法是将旧 DLL 维护在单独的共享目录中,并在制作新 DLL 时,将它们编译为设置为旧 DLL 集的二进制兼容性。这样做是为了在我注册新的 DLL 时不更改 GUID。这些 GUID 用作其他 DLL 中的引用,我在发布期间没有干扰。

我很确定我没有添加任何东西来破坏二进制兼容性规则(签名、公共方法、变量等没有变化)为什么会出现这个错误?

不检查基本的东西我是菜鸟吗?从早上开始就挠头。非常感谢任何帮助。

编辑:如果我的签名有任何变化,有没有一种方法可以在不比较代码的情况下知道?

【问题讨论】:

  • 您的代码可能较早地破坏了兼容性。当您添加任何新的公共方法或属性时,VB6 不会发出警告,但后续编译会创建不同的类型库 - 因为您的参考 DLL 尚不包含此新方法。 (我经常将 dll 兼容性设置为 dll 本身。)我认为(但没有经历过)特定消息(......找不到定义)可能表明项目引用发生了一些变化,或者您已经卸载/取消注册了一些其他组件来自您的系统。
  • 您的二进制兼容性目标使用了未在构建机器上正确注册的外部类型库(可能是另一个 VB6 项目)中的类型,或者是新/旧不兼容版本。
  • @Arvo - 是的,代码可能更早损坏。在这种情况下,应该至少有两个类型库(一个用于中断前,一个用于中断后)。但我的注册表只包含一个
  • @wqw 实际上我在同一台机器上进行构建。我怀疑有问题的 DLL 引用的某些类型可能有问题。但是当单独构建时,它们根本不会给我带来任何问题。

标签: vb6 dll binary-compatibility


【解决方案1】:

使用您的旧 DLL 并为其添加 compat_ 前缀。

基本上将您的MyAppDataAccess.dll 文件重命名为compat_MyAppDataAccess.dll

现在转到您的 ActiveX DLL 的属性并将您的项目设置为与新的compat_MyAppDataAccess.dll 具有二进制兼容性,如下所示。

现在只需构建您的 DLL 并部署它。

它应该工作。如果实际上您的二​​进制兼容性会因您的更改而被破坏,那么您将收到一条警告说明。

【讨论】:

  • 这不是引用同一个 DLL 本身吗?不确定这是否是一个好方法。听起来很吓人。我不需要两个都注册吗?
  • 基本上是的,但是为什么会很可怕呢?您不必同时注册它们。 compat_ 只是为了提供二进制兼容性——您不必分发它。我有一堆 VB6 应用程序,它们有大量的库依赖项,这是确保库不会破坏二进制兼容性的唯一方法。
  • 好的!这行得通。我在共享位置为兼容的 DLL 创建了一个单独的文件夹。接受答案,因为它解决了我的问题。谢谢
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 2012-09-24
  • 2014-07-15
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2016-08-20
相关资源
最近更新 更多