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

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

我在我的 asp.net Web 应用程序中使用第 3 方 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”来尝试解决此错误

但是遇到了同样的错误......

谁能帮忙解决这个问题......

最佳答案

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

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

为了调试这个问题,我将消除 IIS 的复杂性。您需要处理更多的 p/invoke 和 IIS 层。首先确保您可以从另一个 native 程序加载此 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吗?此时,我将在配置文件模式下使用 Dependency Walker 来尝试找出哪个 DLL 是麻烦制造者。

关于visual-studio-2010 - 尝试加载 dll 时出错 - 尝试加载格式不正确的程序。 (HRESULT : 0x8007000B) 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16896718/

相关文章:

c++ - Xcode 与 Visual Studio : Difference in runtime for compiled C++ programs

winapi - 如何写入使用 FILE_FLAG_NO_BUFFERING 打开的文件的结尾?

c++ - 在主 win32 窗口中创建窗口控制台

c++ - MSVC 2017 违反单个翻译单元内的静态初始化顺序

c++ pragma #error 报错

c++ - 无需注册 DLL 即可解决 C4772 错误的任何方法?

visual-studio-2010 - 如何显示你在xml评论中设置的评论文字?

c++ - SetScrollPos 阻塞

visual-c++ - "CL.exe"退出,代码为 -1073741515

c++ - 引用多级指针的更好方法?