【发布时间】:2018-07-11 07:53:28
【问题描述】:
我有一个应用程序(.Net 4.6.1,WPF),它需要在生产系统上运行一个特定的 .dll(非托管)。该 DLL 有两个版本(x64 和 x86)。我如何(应该)在我的项目中为不同平台打包 DLL?
当然,有可能创建两个项目,一个只针对 x64,一个分别针对 x86,但我想避免这种开销。
理想情况下,我正在考虑类似文件夹结构的东西
cwd/
app.exe
component.dll
lib/
x86/
provided.dll
x64/
provided.dll
应用程序在启动时根据运行时平台 (x64/x86) 加载正确提供的 DLL。
很遗憾,我无法更改应用程序本身的程序集加载(在启动时自动完成)。
关于搜索路径,我检查了 [1],但找不到特定于平台的加载信息。
有没有办法(最佳实践)来实现这一目标?
[1]https://docs.microsoft.com/de-de/windows/desktop/Dlls/dynamic-link-library-search-order
【问题讨论】:
-
您需要以一种或另一种方式将您的应用程序与 x64 dll 一起分发到 64 位系统,反之亦然。您目前如何部署应用程序?
-
目前,通过处理优化的发布版本以及所需的 DLL 来部署应用程序。在当前的生产环境中,只有 x64 设备,因此主应用程序(Any CPU)以及 x64 的 DLL 运行良好。现场部署了具有 x64 和 x86 架构(Win 7 和 Win 10)的新系统。该应用程序应该可以在自动加载正确 DLL 的两个系统上运行。
-
由于我无法控制加载顺序本身,因此最好将两个版本中的 DLL 打包在(子)文件夹中,并且运行时链接器可以选择正确的。问题是,这是可能的还是我需要为它提供不同的应用程序二进制文件?
-
如果您无法修改代码,您将不得不提供不同的二进制文件。但是,如果您手动复制应用程序文件,这应该不是问题。只需提供两个版本的应用程序;一个 32 位和一个 64 位版本。
-
@mm8 我很害怕...我希望在链接器级别有另一个解决方案 - 感谢您清理问题 - 祝您有美好的一天!