【问题标题】:How should I name a native DLL distributed in both 32-bit and 64-bit form?我应该如何命名以 32 位和 64 位形式分发的本机 DLL?
【发布时间】:2010-03-05 08:46:14
【问题描述】:

我有一个 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# 不是一种选择。

建议?有什么建议吗?

【问题讨论】:

    标签: dll win64 native-code


    【解决方案1】:

    客户端应用程序不必必须“知道”它们是 32 位还是 64 位。操作系统会自动从适当的位置加载 DLL,因为无法将 32 位 DLL 加载到 64 位进程中,也不可能将 64 位 DLL 加载到 32 位进程中。

    如果 32 位应用程序尝试从 system32 加载某些内容,操作系统会静默地将其重定向到 SysWow64 目录,从而强制加载 32 位版本。

    通过使用不同的名称,您会破坏整个机制。一种专门为允许您使用相同名称而构建的机制。

    【讨论】:

    • 您的回答假定我的 DLL 将始终安装在共享系统文件夹中,这绝对不是一个有效的假设。我的许多(大多数?)客户更喜欢在应用程序旁边为他们的应用程序安装支持 DLL。然而!我同意(正如您在我的自我回答中看到的那样)最好不要与市政厅争吵,所以我有两个绝对不可互换且名称相同的 DLL,而 Windows 没有提供内置方法来区分哪个是哪个。
    • @Spike0xff 将库的副本与可执行文件一起存储违背了共享库的目的。您可能应该是静态链接。如果要存储整个库的副本,不妨将其嵌入到可执行文件中。至少,它会丢弃未使用的部分。
    【解决方案2】:

    为什么不在 dll 前加上下划线……例如 product_32.dllproduct_64.dll?或者通过使用平台前缀 - product_x86_32.dllproduct_x86_64.dll 来表明这一点?至少这将消除 DLL 命名的混乱......你怎么看?

    【讨论】:

      【解决方案3】:

      我决定在这方面跟随微软,当他们进入 64 位时,他们在 System32 中保留了相同的 DLL 名称。在 Win7/64 上,System32\avicap32.dll 是一个 64 位的 DLL!

      对于我自己和我的客户来说,使用相同名称的 32 位和 64 位 DLL 可能会造成一些混淆。但是,我认为让我的所有客户都必须使他们的代码字宽敏感会更糟。尤其是 .NET 开发人员,他们经常可以将目标平台设置为“AnyCPU”。

      【讨论】:

        【解决方案4】:

        某些调用 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 | |:--------- |:-------------|:---------------| |方案一 | MyDll32.dll | MyDll64.dll | |方案二 | MyDll.dll | MyDll_64.dll |

        如果两个 DLL 必须位于同一文件夹中(例如在应用程序旁边),则使用不同的名称会很有用。

        注意:如果您不需要有不同的名字,我同意answer of doug65536。如果您将 DLL 安装在 Windows 系统文件夹(SysWOW64 和 System32)中,则最好使用 同名 MyDll.dll 来处理这两个位,并在需要时让 Windows 发挥作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-11
          • 2012-03-17
          • 2012-05-22
          • 1970-01-01
          • 2012-05-12
          • 2014-04-27
          • 2012-04-03
          相关资源
          最近更新 更多