已部署的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)
我读了很多关于这个话题的帖子,包括:
试图加载格式不正确的程序错误
"尝试加载格式不正确的程序",即使平台相同
但我认为它们不适用于
- 我有一个64位应用程序。
- 编译为x64
- 配置为x64
- 我已经验证它是在x64 IIS应用程序池下运行的。
- enable32bitapplications设置为false。
- c# dll导入和非托管dll编译为64位。 我已经在服务器机器上以发布和调试模式部署到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位进程中运行。
对于非托管DLL有一个额外的依赖项,它是一个c++可重新分发的DLL。那个DLL在机器上的拷贝是32位的,一旦我把版本换成64位,它就能正常加载了。
经验教训,DLL的所有依赖项必须存在并且正确的位值
您需要在IIS中将Enable32bitApplications设置为true