部署的64位c#应用程序无法加载非托管dll

时间:2015-07-13 20:50:43

标签: c# c++ .net iis

我在Windows Server 2008(IIS 7)和Windows Server 2012(IIS 8)上部署了一个用64位Web应用程序部署到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 - 没有区别。
  8. 应用程序中有32位dll,但它们位于完全独立的项目中,这些项目没有引用或引用错误的项目。

    有关其他信息,它在IIS Express中的本地计算机和通过IIS(Windows 7)部署的本地计算机上运行正常,因此在某处无法断开连接,我无法对其进行跟踪。

    其他信息:

    非托管DLL确实依赖于:

    • 的Kernel32.dll
    • ADVAPI32.DLL
    • Crypt32.dll
    • 的User32.dll
    • VERSION.DLL

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

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

    另外,我(只是为了踢和吃喝玩乐)将Enable32BitApplications设置为True并且我得到相同的错误,因为我的项目是64位项目并且引用了64位非托管DLL,它无法在32位进程中运行

2 个答案:

答案 0 :(得分:1)

作为c ++可再发行的dll的非托管DLL还有一个额外的依赖项。机器上的DLL副本是32位,一旦我将版本换成64位,它就装得很好。

经验教训,必须存在DLL的所有依赖项和正确的Bitness。

答案 1 :(得分:-2)

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