Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
部署的64位c#应用程序可以';无法加载非托管dll_C#_C++_.net_Iis - Fatal编程技术网

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

部署的64位c#应用程序可以';无法加载非托管dll,c#,c++,.net,iis,C#,C++,.net,Iis,我在windows server 2008(IIS 7)和windows server 2012(IIS 8)上都部署了一个用c#编写的64位web应用程序 应用程序的一部分涉及从C代码中访问非托管C++ DLL。当我部署到IIS时,此调用失败。我得到了经典: 试图加载格式不正确的程序。(HRESULT的异常:0x8007000B) 我读过很多关于这个主题的文章,包括: 但我认为它们不适用于 我有一个64位的应用程序 它被编译为x64 它部署为x64 我已验证它在x64 IIS应用程序池下运

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

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

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

我读过很多关于这个主题的文章,包括:

但我认为它们不适用于

  • 我有一个64位的应用程序
  • 它被编译为x64
  • 它部署为x64
  • 我已验证它在x64 IIS应用程序池下运行
  • enable32bitapplications设置为false
  • c#dll导入和非托管dll都编译为64位
  • 我已经在服务器机器上以发行版和调试模式部署了IIS-没有区别
  • 应用程序中有32位DLL,但它们位于完全独立的项目中,不被抛出错误的项目引用,也不引用该项目

    有关其他信息,它在IIS express中的本地计算机和通过IIS(windows 7)部署的本地计算机上都可以正常运行,因此某个位置存在断开连接,我无法跟踪它

    其他信息:

    非托管DLL确实依赖于:

    • 内核32.dll
    • Advapi32.dll
    • Crypt32.dll
    • User32.dll
    • 版本.dll
    我知道它们是32位的,我以为它们是32位的,但在64位的机器上,它们生活在System32中,所以我不确定。。。但是如果是这样的话,我如何才能让它编译,因为非托管DLL本身被编译为64位

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


    另外,我已经(仅针对kicks和skittles)将Enable32BitApplications设置为True,我得到了相同的错误,因为我的项目是一个64位的项目,并且引用了一个64位的非托管DLL,在32位进程中不能运行。

    < p>您需要在IIS中设置Enaby32位应用程序为true。

    < P>对作为C++可重新分配DLL的非托管DLL有附加依赖性。机器上DLL的副本是32位的,一旦我把版本换成64位,它就可以正常加载了


    吸取的教训是,DLL的所有依赖项都必须存在且位正确。

    您是否验证了服务器上的本机DLL实际上是x64?我验证了,我将部署到服务器上的DLL拖到了我的计算机上,并使用dumpbin.exe验证了它们是64位。检查本机DLL的依赖项。可能其中一个依赖项是32位二进制文件。您可以使用列出依赖项。@IInspectable请参阅上面的其他信息。您可以在32bitApplicationEnabled设置为true的情况下运行64位的应用程序。至少可以尝试一下。如果它成功运行,则有一个被引用的32位DLL,除非将此标志设置为true,否则应用程序将不会运行。因此出现错误…您无法将32位DLL加载到64位进程中。很抱歉,您是正确的。默认情况下,IIS将仅支持64位应用程序。现在需要显式启用32位应用程序。然而,我仍然会说,一个32位的DLL正在尝试加载:)结果证明你是正确的一半。试图加载32位DLL,但我需要关闭DLL,而不是启用32位应用程序。