通过为二进制文件选择不同的名称来防止不兼容

时间:2014-05-16 23:18:02

标签: windows dll bin

您经常看到开发人员为其软件项目提供了“bin32”和“bin64”输出文件夹,并且在这些文件夹中存放了构建的可执行文件,通常称为<project_name>.exe,类似于<project_name>_d.exe调试版本。这对我来说似乎有点奇怪,所以我开始怀疑是否有任何理由为发布和调试版本命名你的32位和64位二进制文​​件,只将它们放在不同的文件夹中分开。

以下引自this msdn page的话引起了我的注意:

  

如果已在内存中加载了具有相同模块名称的DLL,则系统将使用加载的DLL,无论它在哪个目录中。系统不会搜索DLL。

假设我在32位和64位版本中有一个名为X的项目。在运行32位版本的X.exe(使用32位的X_core.dll)时,我启动了X.exe的64位版本。根据上面的msdn文章,系统尝试执行64位版本的X.exe动态链接到32位版本的X_core.dll

简单地按名称比较dlls对我来说似乎有些奇怪和危险。这不是更明确地命名二进制文件的好理由,例如<project_name>32.dll<project_name>64.dll用于发布版本,<project_name>_d32.dll<project_name>_d64.dll用于调试版本吗?

注意:我确实理解为什么人们会将他们的调试版本命名为与发布版本不同。主要是,我想知道为什么分离32位和64位构建是如此常见,而不是调试和发布版本。

1 个答案:

答案 0 :(得分:1)

64位进程无法加载32位DLL,反之亦然。在您链接到的MSDN文章中,它所指的“内存”是“调用进程的内存”。进程一次只能加载一个兼容(相同位)DLL模块的实例。