如何为同时分发32位和64位的本地DLL命名?

3
我有一个商业产品,是DLL(本机32位代码),现在需要构建64位版本。所以,当安装在64位Windows上时,32位版本放到Windows\SysWOW64中,而64位版本放到… Windows\System32中!(我在这里咬着我的舌头……)或者DLL可以与客户端应用程序一起安装。
那么,我应该如何命名64位DLL呢?
与32位相同的名称:两个执行相同操作但完全不可互换的文件具有相同的名称,这难道不是引起混淆和支持问题的风险吗?
不同的名称(例如product.dll和product64.dll):现在,客户端应用程序必须知道它们正在运行32位还是64位,才能引用我的DLL,而有些语言直到运行时才能确定- .NET只是一个例子。现在,所有静态编译的客户端都必须有条件地编写导入声明:IF target=WIN64 THEN import Blah from "product64.dll" ELSE import Blah from "product.dll" ENDIF
该产品包含大量的C代码和大块的C++代码-将其移植到C#不是一个选项。
建议? 提示?
4个回答

2
客户端应用程序无需知道自己是32位还是64位。操作系统会自动从适当的位置加载DLL,因为无法将32位DLL加载到64位进程中,也无法将64位DLL加载到32位进程中。
如果32位应用程序试图从system32加载某些内容,则操作系统会悄悄地将其重定向到SysWow64目录,强制加载32位版本。
通过使用不同的名称,您可以打败整个机制。这个机制是专门为了让您使用相同的名称而建立的。

1
你的回答假设我的DLL始终安装在共享系统文件夹中,这绝对不是一个有效的假设。许多(大多数?)客户更喜欢将支持应用程序的DLL与应用程序一起安装。 然而!我同意(正如您可以在我的自我回答中看到的那样),最好不要与市政厅作对,因此我有两个完全不可互换的具有相同名称的DLL,并且Windows没有内置的方法来区分它们。 - Spike0xff
@Spike0xff 将库的副本存储在可执行文件旁边会破坏共享库的目的。您应该考虑使用静态链接。如果您要存储整个库的副本,那么最好将其嵌入到可执行文件中。至少这样可以删除未使用的部分。 - doug65536

1
为什么不在dll的前面加上下划线,例如product_32.dll和product_64.dll?或者使用平台前缀来表示 - product_x86_32.dll和product_x86_64.dll?至少这样可以消除DLL命名的混乱...你觉得呢?

0

我决定效仿微软的做法,在64位系统中,System32文件夹下的DLL文件名保持不变。在Win7/64上,System32\avicap32.dll是一个64位的DLL文件!

这可能会对我和我的客户造成一些混淆,因为32位和64位的DLL文件名称相同。然而,我认为让所有客户都必须使其代码具有字宽敏感性会更糟糕。特别是.NET开发人员,他们经常将目标平台设置为“AnyCPU”。


0

一些调用DLL的语言具有根据调用应用程序位数自适应名称的机制。
例如,在LabVIEW中,当使用以下两种模式之一时,DLL名称可以自动适应:

  1. MyDll*.dll将在win32上转换为MyDll32.dll,在win64上转换为MyDll64.dll
  2. MyDll**.dll将在win32上转换为MyDll.dll,在win64上转换为MyDll_64.dll(注意下划线)。

因此,建议为以32位和64位二进制形式分发的本地DLL命名方案如下: | | win32 | win64 | |:--------- |:--------------|:---------------| | Scheme 1 | MyDll32.dll | MyDll64.dll | | Scheme 2 | MyDll.dll | MyDll_64.dll |

如果两个DLL都必须位于同一文件夹中(例如与应用程序并排放置),则具有不同名称可能很有用。

注意:如果您不需要使用不同的名称,我同意doug65536的答案。如果您将DLL文件安装在Windows系统文件夹(SysWOW64和System32)中,则最好为两个位数都使用相同的名称MyDll.dll,并让Windows在需要时自动处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接