2011-05-18 47 views
1

我在使用P/Invoke for C#時遇到了麻煩。下面是我試圖從該.dll調用函數(用C++編寫):對C#使用C++ .dll函數時BadImageFormatException錯誤?

string 
BeatTracker::getName() const 
{ 
    return "Tempo and Beat Tracker"; 
} 

這裏是我試圖調用這個函數代碼:

[DllImport("qm-vamp-plugins.dll",EntryPoint="BeatTracker")] 
public static extern string getName(); 

public QMTempo() 
{ 
    Console.WriteLine(getName()); 
} 

似乎是什麼錯誤?我得到一個BadImageFormatException。除了IDE給我的模糊名稱之外,我怎麼能知道將來的參考文獻有哪些錯誤?順便說一句,我正在使用Visual Studio 2008。

此外,我正在使用(但不知道是否正確)EntryPoint,讓它知道我使用BeatTracker類中的getName函數(因爲還有其他類的getName函數,它們包含在單個函數中。 dll文件)

謝謝!

回答

7

此異常可以由所使用的.NET運行PROC架構和導入的DLL之間的mismath引起一。

更確切地說:

你使用64位Windows?運行時默認情況下將運行在64位。如果您的C++庫以32位編譯,您將在加載庫時收到BadFormatException。如果您的.NET應用程序運行32位,並且您的C++庫編譯的目標是x64,則情況也是如此。

如果你可以重新編譯這個庫,那就去做吧。否則,您可以強制.NET運行時在編譯時使用指定的體系結構,但會阻止它在其他體系結構上運行。這是你的選擇;)當對.NET或java進行編碼時,我們往往忘記了底層真正發生了什麼。

+0

嗨!這似乎是問題!謝謝!它的固定現在(但後來我得到新的錯誤) – user488792 2011-05-18 09:02:32

2
[DllImport("qm-vamp-plugins.dll",EntryPoint="BeatTracker")] 

EntryPointgetName(),不BeatTracker這是一類!

但即便如此,你不能稱之爲,因爲getName()是成員函數,它是不能沒有實例調用。

所以我建議在DLL中定義自由函數並導出它們。您可以在DLL內部使用類。你可以使用類的句柄。

實施例,

DLL的代碼:

typedef BeatTracker* PBeatTracker; 
typedef PBeatTracker HBeatTracker; 

//exported functions 
HBeatTracker CreateBeatTracker() 
{ 
     return new BeatTracker(); 
} 
void DeleteBeatTracker(HBeatTracker handle) 
{ 
    delete handle; 
} 
string getName(HBeatTracker handle) 
{ 
    return handle->getName(); 
} 

C#代碼:

[DllImport("qm-vamp-plugins.dll",EntryPoint="CreateBeatTracker")] 
public static extern IntPtr CreateBeatTracker(); 

[DllImport("qm-vamp-plugins.dll",EntryPoint="DeleteBeatTracker")] 
public static extern void DeleteBeatTracker(HBeatTracker); 

[DllImport("qm-vamp-plugins.dll",EntryPoint="getName")] 
public static extern string getName(); 

public QMTempo() 
{ 
    IntPtr handle = CreateBeatTracker(); 
    Console.WriteLine(getName(handle)); 
    DeleteBeatTracker(handle); 
} 
+1

儘管這並沒有解釋BadImageFormatException(也就是說,正如Maupertuis所指出的那樣,可能是32/64位不兼容),但這肯定是user488792將要獲得的下一個問題,所以+1 :) – OregonGhost 2011-05-18 08:48:55

+0

然後,編組返回值將不得不被解決 – 2011-05-18 08:52:34

+0

@David:哪個?請隨意編輯帖子。我不是p/invoke的專家,所以我可能不會自己解決編組問題(截至目前)。 – Nawaz 2011-05-18 08:55:29