2013-01-17 59 views
0

我有一個C#應用程序(86 .NET 3.5在Windows 7 VS2010),它調用C函數對PInvoke函數「ABC」的調用使堆棧不平衡。

,當我升級到.NET 4,我得到了以下信息:

這可能是因爲託管PInvoke簽名與非託管目標籤名不匹配。檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名相匹配。

Ç簽名:

BOOL ABC(UDF_HANDLE手柄,字符* pQualifiedName) //#限定UDF_HANDLE無效*

C#側:

[SecuritySafeCritical] 
    [DllImport(dllPath, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, ThrowOnUnmappableChar = true)] 
    internal static extern int ABC(
     [In] IntPtr handle, 
     [MarshalAs(UnmanagedType.LPStr)] string qualifiedName); 

任何幫助理解。

+0

這裏它是頭文件中的簽名:int ABC(int handle,char * pQualifiedName); – Khayralla

+0

問題在於:BOOL ABC(UDF_HANDLE handle,char * pQualifiedName)//定義UDF_HANDLE void *和頭文件中的定義:int ABC(int handle,char * pQualifiedName); – Khayralla

回答

0

我重新定義了ABC第一個參數,它與函數中的第一個參數相同。

+0

在x86上,int和IntPtr的大小相同,因此您的答案只能解釋 –

0

C++代碼使用cdecl調用約定。但是你已經在你的p/invoke中指定了stdcall。在C#代碼中改變它,你的兩個聲明將會匹配。