【问题标题】:How 32 bit C# application can utilize a 64 bit DLL32 位 C# 应用程序如何利用 64 位 DLL
【发布时间】:2013-04-11 16:27:07
【问题描述】:

我有一个带有目标 x86 安装程序的 32 位 C# 应用程序。这个应用程序可以安装在 x64 机器上运行没问题。然而,当我们在 x64 系统上安装时,来自供应商的第三方硬件(集成到软件中)现在需要使用 64 位 DLL。

目前我已经在我的项目中放置了 32 位 DLL 和 64 位 DLL。然而,目标 x86 安装程序显然不喜欢 64 位 DLL。

我是否可以创建一个解决方案,让我可以部署 64 位 DLL 和/或 32 位 DLL 并且仍然只有一个安装程序项目? (我查看了名为 Advanced Installer 的第三方软件,但我不确定这是否能帮助我实现所需的解决方案)

或者是否可以创建一个通用的安装程序项目?

注意:两个安装程序(x86 与 x64)部署是不可行的,因为我们有一个自动更新的过程,我不想重新定义。维护一个 MSI 文件对我来说很重要。

非常感谢您的建议。

【问题讨论】:

  • 您可以在 NSIS 中执行此操作。
  • 真正的问题是您将无法从您的 x86 应用程序中使用 x64 DLL。
  • 您不能在 32 位进程中使用 64 位 DLL(反之亦然)。这部分是因为没有办法在地址空间之间进行转换。见this post on Raymond Chen's blog for details。如果要混合使用 64 位和 32 位,则必须有两个进程,以及某种进程间通信。
  • @Encryption:你测试过一次吗?编译在这里并不是一个真正的指标,特别是如果有问题的 DLL 是非托管的。
  • 我可以编译很多不值得的东西。

标签: c# 32bit-64bit


【解决方案1】:

使用 Advanced Installer 从 x86 MSI 安装文件不是问题,以下文章解释了如何执行此操作: http://www.advancedinstaller.com/user-guide/qa-OS-dependent-install.html

另外,如果您有两个同名的 DLL 版本需要放在文件夹中,您应该查看这里:http://www.advancedinstaller.com/user-guide/qa-install-file-with-same-name.html

但是,您应该首先检查您的应用程序是否可以正确加载 x64 DLL,正如他们在 cmets 中提到的那样。

【讨论】:

  • 他为什么要检查?该进程以 x86 为目标,这意味着它只有 32 位进程。即使它设置为ANY CPU,如果它引用单个 32 位库,它也将是一个 32 位进程。这也意味着它将无法加载任何 64 位库。
  • 我已经考虑到这个 DLL 可能由 Encryption 提到的第三方组件加载,而不是直接由他的 x86 应用程序加载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 2012-03-03
  • 2021-03-10
  • 2020-05-29
  • 2011-03-03
相关资源
最近更新 更多