尝试加载DLL时出错 - 尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)

时间:2013-06-03 12:28:50

标签: visual-studio-2010 winapi visual-c++ 32bit-64bit dllimport

我在我的asp.net Web应用程序中使用第三方c ++ dll。

dll - 64-bit
asp.net Platform - Any Cpu
asp.net Framework - 4.0 (vs 2010)
System Os - Win 7 Professional (64-bit)

我已将dll放在Applications文件夹中,并使用其完整路径调用dll:

[DllImport(@"D:\Application\Sampledll.dll",
            EntryPoint = "SampleFunc",
            CharSet = CharSet.Ansi,
            CallingConvention = CallingConvention.StdCall)]
    public static extern int SampleFunc(char[] ch1, char[] ch2);

但我得到了以下结果:

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

使用错误代码搜索时:0x8007000B - 这意味着'在64位系统上使用32位dll'

但是dll是64位dll ....

我是如何通过将VS的目标平台更改为'x86'和&而尝试解决此错误的方法。 'x64'并将IIS的'启用32位应用程序'属性设置为'True'

但得到同样的错误.........

任何人都可以帮助解决这个问题....

1 个答案:

答案 0 :(得分:3)

错误代码0x8007000B是表示Win32错误ERROR_BAD_FORMAT的COM错误代码。通常,当32位进程尝试加载64位DLL时,反之亦然,错误代码为ERROR_BAD_EXE_FORMAT,当包含在COM错误代码中时,它将显示为0x800700C1

因此,我认为问题不是32/64位不匹配。最可能的解释是DLL或其依赖项之一已损坏。

为了调试这个,我会删除IIS的复杂性。你已经添加了p / invoke和IIS的层来处理。首先确保您可以从另一个本机程序加载此DLL。在VS中创建一个64位C ++控制台应用程序:

#include <windows.h>
#include <iostream>

int main()
{
    if (!LoadLibraryA("D:\\Application\\Sampledll.dll"))
    {
       std::cout << GetLastError() << std::endl;
    }
}

查看运行时会发生什么。如果你得到一个错误代码,它有什么价值?是ERROR_BAD_FORMAT吗?此时我将在Profile模式下使用Dependency Walker来尝试找出哪个DLL是麻烦制造者。