我在我的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'
但得到同样的错误.........
任何人都可以帮助解决这个问题....
答案 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是麻烦制造者。