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

本文关键字:加载 dll 部署 64位 应用程序 | 更新日期: 2023-09-27 18:02:41

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

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

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

我读了很多关于这个话题的帖子,包括:

试图加载格式不正确的程序错误

"尝试加载格式不正确的程序",即使平台相同

但我认为它们不适用于

  1. 我有一个64位应用程序。
  2. 编译为x64
  3. 配置为x64
  4. 我已经验证它是在x64 IIS应用程序池下运行的。
  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
  • Version.dll

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

还有,为什么它在本地对我有效?

另外,我有(只是踢和嬉戏)设置Enable32BitApplications为True,我得到同样的错误,因为我的项目是64位项目,引用64位非托管DLL,它不能在32位进程中运行。

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

对于非托管DLL有一个额外的依赖项,它是一个c++可重新分发的DLL。那个DLL在机器上的拷贝是32位的,一旦我把版本换成64位,它就能正常加载了。

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

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