【发布时间】:2014-09-25 11:17:52
【问题描述】:
在 Windows 上,我的 x64 库 (foo.dll) 对另一个与 32 库 (foreignlibrary.dll) 同名的 x64 库 (foreignlibrary.dll) 具有延迟加载的依赖关系。当然,它们位于不同的目录中。通常使用数字,如 msvcr110.dll 或 msvcr120.dll,但在这种情况下它不是。
我的库无法加载,因为(至少这是依赖 walker 告诉我的)因为它加载了 32 位版本的 foreignlibrary.dll。
它似乎是它找到的第一个具有此名称的名称。如何确保加载了正确的 x64 库。
【问题讨论】:
-
部署那个 x86 版本到底有什么意义呢?它永远不会有用。仅使用 foo.dll 的 x86 版本部署它
-
我没有部署外部(32位)库,它已经像msvcr110.dll的32位版本一样在系统上,我对此无能为力。我只是说这个库似乎已加载,因为名称匹配,因此似乎不存在其他检查。
-
很不清楚为什么它会发现该 DLL 的错误位数,Windows 对此有非常具体的对策。例如,32 位进程被重定向到 c:\windows\syswow64 和 c:\program 文件 (x86)。无论如何,将您所依赖的任何 DLL 放在与 EXE 相同的目录中。那是操作系统首先出现的地方,它永远不会出错。复制 msvcr110.dll 的正确位数由您决定
-
通过许可,我可能不允许发送/复制/修改 dll,所以我可能会迷失在这里。认为windows中的这个manifest-hell和lookup-procedure可以避免这些问题。
-
这完全取决于第三方库是如何设置的。你有没有问过供应商你应该怎么做?无论如何,您总是可以选择在运行时加载库,而不是使用加载时间或延迟加载。 (题外话但重要的警告,因为您已经提到了许可:一些开发人员声称您必须拥有许可才能开发动态链接到其 DLL 的代码。如果您不确定相关许可是否授予您许可这样做,您可能需要咨询律师。)