如果它的输出没有改变,我是否需要重建dll?

时间:2010-10-05 07:34:26

标签: windows dll dllimport

这可能是一个非常愚蠢的问题。但假设我有一个DLL(test.dll),带有一些导出,在构建时生成一个导入库(test.lib)。我有一个使用此DLL的应用程序TestApp。

现在,如果我想更改DLL中的某些函数实现,并且保持导出不变,我是否需要重建使用此DLL / import lib的应用程序?

感谢。

3 个答案:

答案 0 :(得分:3)

没有。你不需要重建dll。

考虑到您的应用程序适用于Windows XP,有一天Windows 7会出现。即使系统dll如user32.dll,kernel32.dll被更新,同样的应用程序仍可继续工作而无需重建!

答案 1 :(得分:1)

没有。共享库(vs静态库)的目的之一就是这样:只要外部看到的内容不会改变(导出的定义/函数),使用它的应用程序就不需要重新编译。

答案 2 :(得分:1)

如果函数是C函数,并且您没有更改正在传递的任何结构的定义,则无需重新构建应用程序。

如果DLL导出C ++类,则需要重建导入模块 - 即使方法签名没有改变,C ++类导出也是漏洞:为类分配空间时,没有定义的分配器函数导出(默认情况下)导入模块在调用(导出的)构造函数之前必须猜测要分配多少空间。它通过解析类定义来构建猜测。

这样做的不幸后果是,即使您只小心改变类实现细节 - 即使方法签名保持不变并且dll将成功加载,应用程序也会在创建时分配不正确的字节数堆或堆栈上的新实例。