【发布时间】:2009-08-25 03:26:06
【问题描述】:
我的另一个 P/Invoke 问题!我有这个 C 函数:
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:
试图读取或写入受保护的内存。这通常表明其他内存已损坏。
我需要分配一些内存吗?这是一段如此简单的代码,我看不出有任何明显的问题。
编辑: _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;
}
【问题讨论】:
标签: c# reference struct pinvoke