2011-07-29 84 views
2

我正在編寫一個WPF應用程序,需要調用存在於我寫的一個dll中的一些C++代碼。即使使用最基本的測試功能,我總是會收到PInvokeStackImbalance錯誤。例如,在C++ dll中:PInvokeStackImbalance從C調用dll函數時#

extern "C" __declspec(dllexport) void Test(int foo); 

該函數什麼都不做。 C#的側面看起來是這樣的:

[DllImport("myDll.dll", CharSet = CharSet.Auto)] 
    private static extern void Test(int foo); 

而且我把這個C#的功能,像這樣:

測試(1)

...我得到一個PInvokeStackImbalance!怎麼會這樣?

在此先感謝...

湯姆

回答

5

嘗試指定CallingConvention.Cdecl。文檔中有一個示例。桌面窗口上的默認調用約定爲Winapi;但是你的函數被聲明爲extern C

+0

這個解決方案也適用於'FORTRAN'同樣的問題。只需發出'!DEC $ ATTRIBUTES C :: myproc'。 – ja72

2

您的[DllImport]聲明缺少CallingConvention。必需的,你的測試函數是Cdecl,因爲你沒有使用__stdcall關鍵字。 __cdecl和__stdcall之間的差異是堆棧在調用之後被清除的方式。 __cdecl是大多數C++編譯器的默認設置,包括Microsoft的。要在C++端修復它,你應該這樣聲明:

extern "C" __declspec(dllexport) 
void __stdcall Test(int foo);