2013-06-03 57 views
1

Iam在我的asp.net web应用程序中使用第三方C++ dll。尝试加载dll时出错 - 尝试加载格式不正确的程序。 (来自HRESULT的例外:0x8007000B)

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

我已经放置在应用程序文件夹中的DLL和调用它的完整路径的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 - 这意味着

但DLL“在64位系统中使用32位DLL”是64位DLL ....

任何如何通过将VS的目标平台更改为'x86'&'x64'并将IIS的“启用32位应用程序”属性设置为试图解决此错误“真”

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

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

+0

FWIW如果函数的参数是以null结尾的字符串输入参数,它应该是'string'而不是'char []'' –

+0

这是您在纠正问题一段时间后得到的错误代码。你需要记录的是你第一次尝试做这件事时看到的* first *错误。一定要撤消你所做的努力来解决这个问题,这很可能只会加剧问题。 –

回答

2

错误代码0x8007000B是COM错误代码代表Win32错误ERROR_BAD_FORMAT。正常情况下,当一个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?在这一点上,我会在配置文件模式下使用Dependency Walker来尝试确定哪个DLL是麻烦制造者。

+0

感谢您的澄清.....我没有取代与新的DLL,并回到你身边...... – Renuka

+0

我试过乌尔代码,并得到错误为'错误LNK1123:在转换为COFF期间失败:文件无效或损坏'在调试时 – Renuka

+0

这没有多大意义。我看不到任何需要调试的地方。只需将该程序放在.cpp文件中,并通过64位dev环境将其传递给cl。 –

相关问题