可以对dll进行更改,同时保持与预编译的可执行文件的兼容性吗?

Can changes to a dll be made, while keeping compatibility with pre-compiled executables?

本文关键字:编译 可执行文件 兼容性 dll      更新时间:2023-10-16

我们有很多可执行文件引用了我们的一个dll。我们在一个dll中发现了一个bug,不想重新编译和重新发布所有的可执行文件来修复它。我的理解是,只要您不更改头文件中的任何内容,dll将保持其与可执行文件的兼容性。所以没有新的类成员,没有新的函数等等……但是对函数内的逻辑进行更改应该是可以的。这是正确的吗?如果它是编译器特定的,请让我知道,因为这可能是一个问题。

你的理解是正确的。只要你改变逻辑而不是接口,那么你就不会遇到兼容性问题。

你必须小心的地方是,如果到DLL的接口不仅仅是函数签名。例如,如果原始DLL接受int参数,但新DLL强制该参数的值必须为正,那么您将破坏旧程序。

可以。只要DLL的接口保持不变,旧的可执行文件就可以很好地加载它并使用它。话虽如此,你正走上一条非常危险的道路。随着时间的推移,您修补了越来越多的dll,您可能开始在客户安装中看到几乎无法诊断的奇怪行为。这源于各种组件的不同版本之间的意外交互。从历史上看,这个问题被称为DLL地狱。

在我看来,重新构建、重新测试和重新分发整个应用程序是一个更好的主意。我甚至会进一步建议您使用应用程序清单来确保可执行文件只能与特定版本的dll一起工作。现在看起来可能要做很多工作,但它确实可以在将来为您节省很多麻烦。

看情况

理论上是的,如果你用LoadLibrary加载dll并且没有改变接口,你应该没问题。

如果您使用一些。lib存根与。dll文件进行OTOH链接,则不能保证它会工作。

这就是COM被发明的原因之一。