【发布时间】: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
但我不认为它们适用于
- 我有一个 64 位应用程序。
- 编译为 x64
- 部署为 x64
- 我已验证它在 x64 IIS appPool 下运行。
- enable32bitapplications 设置为 false。
- c# dll 导入和非托管 dll 均编译为 64 位。
- 我已在发布和调试模式下部署到服务器计算机上的 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 请参阅上面的其他信息。