2012-10-29 98 views
3

我正在嘗試編寫reconstructMe SDK的「一分鐘」示例,但是他們的SDK是用C++編寫的我想,我成功地創建了一個控制檯應用程序,按照他們的頁面指示(here ),但我想創建一個簡單的用戶界面,但是我對Visual C++不是很熟悉(我知道關於C++的一些東西),所以我嘗試了他們的C#示例(我非常熟悉他們的UI設計),但'!拉拉Lala.Reme :: reme_context_compile'C++代碼中的視覺C#中的Pinvoke問題

一個調用的PInvoke函數 不平衡堆棧:我使用所提供的C#代碼(here)時出現此錯誤。這很可能是因爲託管PInvoke 簽名與非託管目標籤名不匹配。檢查 PInvoke簽名的調用約定和參數是否匹配 目標非託管簽名。

我認爲是配置項目或類似的問題。

+0

你確保你的C#項目正在編制的x86? – pstrjds

回答

1

reconstructMe DLL正在使用C calling conventionCdecl)而不是Windows調用約定(StdCall)。它們在處理堆棧方面有所不同,這就是爲什麼使用不正確的調用約定會導致堆棧不平衡的原因。

的的P/Invoke默認爲StdCall,您需要將CallingConvension參數手動設置爲CdeclDllImport屬性:

[DllImport("example.dll", CallingConvention=CallingConvention.Cdecl)] 
public static extern int function(int param); 
+0

有趣的是,我們沒有在我們的示例中設置Call​​ingConvention屬性,它對我們來說工作正常。感謝您指出這一點,將更新示例。 – cheind