1

我在我的 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 位应用程序”属性设置为“真”来尝试解决此错误

但是得到了同样的错误…………

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

4

1 回答 1

4

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

因此,我认为问题不在于 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 是麻烦制造者。

于 2013-06-03T12:42:14.190 回答