2013-06-03 51 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。 –

相關問題