2009-05-06 82 views
9

我想從C#傳遞一個結構到C++庫。我將結構作爲對象傳遞,C++函數期望它作爲指針(void *)。如何將結構編組爲一個指向結構的指針?

我遇到了傳遞結構的問題。

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec); 

這裏是運行時異常的文字,我得到:

「不能元帥參數#1「:無效的託管/非託管類型組合(該值類型必須與結構配對)。 「

雖然我發現一個MSDN文章,正是在這種情況下使用LPStruct。

這是我的結構我想名帥:

[StructLayout(LayoutKind.Sequential)] 
public struct UserRec { 
    [MarshalAs(UnmanagedType.I4)] 
    public int userParam1; 
} 

這是C++函數:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {... 

回答

17

嘗試傳遞結構作爲ref參數。

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction(ref UserRec userRec); 

當您使用與結構相結合的ref時,它在概念上傳遞地址。

+4

在這種情況下,我認爲你甚至不需要[MarshalAs]。 – 2009-05-06 01:45:07

+0

@Anton,你是對的(更新) – JaredPar 2009-05-06 01:48:42

13

順便提一句,UnmanagedType.LPStruct很少,如果有的話,正確的MarshalAs參數。 A quote from Adam Nathan誰是微軟的員工:

UnmanagedType.LPStruct僅支持一個具體案例:治療的System.Guid值類型作爲非託管GUID與額外的間接水平。

相關問題