Еще один из моих вопросов 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;
}