另一個我的P/Invoke問題!我有這個C函數:通過引用傳遞結構引起AccessViolationException
int _ei_x_new(ei_x_buff* x);
本質上,它初始化一個新的緩衝區結構。在C#中,我有這樣的:
[DllImport(EIDLL, EntryPoint = "_ei_x_new")]
public static extern int ei_x_new(out ei_x_buff x);
ei_x_buff
很簡單:
typedef struct ei_x_buff_TAG {
char* buff;
int buffsz;
int index;
} ei_x_buff;
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ei_x_buff {
[MarshalAsAttribute(UnmanagedType.LPStr)]
public string buff;
public int buffsz;
public int index;
}
但是當我這樣做:
ei_x_buff buffer;
Ei.ei_x_new(out buffer);
我得到一個AccessViolationException:
Att被迫讀取或寫入受保護的內存。這通常表明其他內存已損壞。
我需要分配一些內存還是什麼?這是一段簡單的代碼,我看不到任何明顯的問題。
編輯:母語爲_ei_x_new
代碼:
// In my wrapper library
DLL_EXPORT int _ei_x_new(ei_x_buff* x) {
return ei_x_new(x);
}
// In external library being wrapped
int ei_x_extra = 100;
int ei_x_new(ei_x_buff* x)
{
x->buff = malloc(ei_x_extra);
x->buffsz = ei_x_extra;
x->index = 0;
return x->buff != NULL ? 0 : -1;
}
P/Invoke簽名已用完。如果你的意思是「拒絕不出來」,它會產生相同的結果。本地簽名在問題中給出:int _ei_x_new(ei_x_buff * x); – 2009-08-25 03:33:39
噢,你的意思是結構的本地簽名?我編輯了我的問題以顯示它。 – 2009-08-25 03:38:51
將其更改爲IntPtr可以停止異常。我可以像這樣離開它,還是需要使用另一種類型? – 2009-08-25 03:44:36