2011-04-20 63 views
3

我用調用C++的Dll到C#工作,遇到了一個問題BadImageFormatException

C++函數:

int _declspec(dllexport) CompressPacket(unsigned char *buff, int offset, int len); 

C#函數:

[DllImport("HuffCompress.dll")] 
      private static extern unsafe int HuffCompress(ref byte[] buff, int offset, int len); 

    ... 

    private unsafe byte[] CompressPacket(byte[] packet) 
    { 
     int len = HuffCompress(ref packet, 12, packet.Length-12); 
     byte[] compressed = new byte[len]; 
     for (int i = 0; i < len; i++) 
      compressed[i] = packet[i]; 
     return compressed; 
    } 

int len = HuffCompress(ref packet, 12, packet.Length-12);

運行時,我得到一個BadImageFormatException

由於C#編輯器的VSC#速成,它不編譯64個程序,所以我不能確定的問題 任何想法將是巨大的

+0

在我看來,有一個命名不匹配。您的C++導出稱爲CompressPacket,而您的C#導入稱爲HuffCompress。 – 2011-04-20 22:06:51

+0

正如大衛說的那樣,這是典型的例外,當代碼正在等待一個32位(或64位)的DLL,並且你給它一個錯誤的位數時 – 2011-04-20 23:11:40

回答

11

Express版本中缺少平臺目標設置幾乎肯定是您的問題。您必須手動編輯項目的.csproj文件。運行notepad.exe並打開.csproj文件。找到屬性組,看起來像這樣:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 

,並加入這一行:

<PlatformTarget>x86</PlatformTarget> 

重複的版本配置組,略低於。

您的下一個問題是函數的名稱,如果您使用C++編譯它,它會被修飾。聲明這樣的:

extern "C" __declspec(dllexport) 
int __stdcall HuffCompress(unsigned char *buff, int offset, int len); 

而且你的C#聲明是錯誤的,滴在第一個參數的裁判關鍵字。

+0

Thx,工作 (我想我把它放在一個早期的測試中,忘了把它拿出來。<) – Qwerty01 2011-04-21 00:31:20

+0

x86技巧解決了BadImageFormatException問題我在Visual C#Express上使用SQLite(system.data.sqlite.org)。 – 2012-09-19 08:03:13

+0

我有同樣的問題。但增加這條線不會改變任何東西。發生同樣的錯誤。在x86控制檯應用程序中,它沒有任何問題,並且直接從「/ Windows/SysWOW64」文件夾中加載dll。當我試圖把它放在我的大項目中時。我不得不將整個dll文件名作爲字符串放到dllimports中。 – Bitterblue 2013-08-08 10:18:32

1

該DLL要麼是損壞的,要麼是錯誤的位數。 32和64位模塊不能混合使用。

相關問題