【问题标题】:Deployed 64bit c# application can't load unmanaged dll部署的 64 位 c# 应用程序无法加载非托管 dll
【发布时间】:2015-10-02 07:09:44
【问题描述】:

我有一个用 c# 编写的 64 位 Web 应用程序部署到 windows server 2008 (IIS 7) 和 windows server 2012 (IIS 8) 上的 IIS。

应用程序的一部分涉及从 c# 代码访问非托管 c++ DLL。当我部署到 IIS 时,此调用失败。我得到了经典:

试图加载格式不正确的程序。 (HRESULT 异常:0x8007000B)

我已经阅读了很多关于该主题的主题,包括:

An attempt was made to load a program with an incorrect format ERROR

“An attempt was made to load a program with an incorrect format” even when the platforms are the same

但我不认为它们适用于

  1. 我有一个 64 位应用程序。
  2. 编译为 x64
  3. 部署为 x64
  4. 我已验证它在 x64 IIS appPool 下运行。
  5. enable32bitapplications 设置为 false
  6. c# dll 导入和非托管 dll 均编译为 64 位。
  7. 我已在发布和调试模式下部署到服务器计算机上的 IIS - 没有区别。

应用程序中有 32 位 dll,但它们位于完全独立的项目中,不被引发错误的项目引用,也不引用。

有关其他信息,它在 IIS express 中的本地计算机和通过 IIS(Windows 7)部署时的本地计算机上运行良好,因此某处断开连接,我无法追踪。

其他信息:

非托管 DLL 确实依赖于:

  • Kernel32.dll
  • Advapi32.dll
  • Crypt32.dll
  • User32.dll
  • 版本.dll

我意识到这些是 32 位的 我以为这些是 32 位的,但是在 64 位机器上,它们存在于 System32 中,所以我不确定......但如果是这样,我怎么能得到它编译为非托管 DLL 本身编译为 64 位。

另外,为什么它会在本地为我工作?

另外,我将 Enable32BitApplications 设置为 True(只是为了好玩),我得到了同样的错误,因为我的项目是 64 位项目并引用了一个 64 位非托管 DLL,它不能在 32 位进程中运行.

【问题讨论】:

  • 您是否验证了服务器上的本机 DLL 实际上是 x64 的?
  • 我做到了,我将部署到服务器的 dll 拉到我的机器上,并使用 dumpbin.exe 验证它们是 64 位的。
  • 检查原生 DLL 的依赖关系。也许其中一个依赖项是 32 位二进制文​​件。您可以使用Dependency Walker 列出依赖项。
  • @IInspectable 请参阅上面的其他信息。

标签: c# c++ .net iis


【解决方案1】:

您需要在 IIS 中将 Enable32bitApplications 设置为 true。

【讨论】:

  • 您可以运行 64x 位应用程序,并将 32bitApplicationEnabled 设置为 true。
  • 至少试一试。如果它成功运行,则您有一个引用的 32 位 DLL,除非您将此标志设置为 true,否则该应用程序将不会运行。因此错误....
  • 您不能将 32 位 DLL 加载到 64 位进程中。
  • 对不起,你是对的。默认情况下,IIS 仅支持 64 位应用程序。这些天您需要明确启用 32 位应用程序。但是,我仍然会说正在尝试加载 32 位 DLL :)
  • 原来你猜对了一半。正在尝试加载 32 位 DLL,但我需要关闭 DLL,而不是启用 32 位应用程序。
【解决方案2】:

非托管 DLL 有一个额外的依赖项,它是一个 c++ 可再发行 dll。机器上那个 DLL 的副本是 32 位的,一旦我将版本换成 64 位,它就可以正常加载了。

经验教训,DLL 的所有依赖项都必须存在并且位元正确。

【讨论】:

    猜你喜欢
    • 2019-08-15
    • 2016-11-25
    • 2012-05-28
    • 2017-04-01
    • 1970-01-01
    • 2012-02-14
    • 2016-08-25
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多