Я имею следующую структуру (пример) в C:Как перевести C-структуру на управляемом C# эквивалент
typedef struct
{
int64 data_size;
uint32 avgdelay;
int esize;
void *epayload;
} stats_t;
Управляемая C# эквивалент следующим образом:
[StructLayout(LayoutKind.Sequential, Size = 4)]
public struct stats_t
{
public Int64 datasize;
public UInt32 avgdelay;
public Int32 esize;
public IntPtr epayload;
}
Когда параметр Тип stats_t используется в вызываемом делете обратного вызова. Я счел необходимым включить фиктивный член UInt32, чтобы иметь возможность вызвать обратный вызов через делегат, чтобы сохранить шаблон байта подписи обратного вызова
[StructLayout(LayoutKind.Sequential, Size = 4)]
public struct stats_t
{
public Int64 datasize;
public UInt32 avgdelay;
public Int32 esize;
public IntPtr epayload;
/// dummy member for alignment
public UInt32 dummy;
}
Обратный вызов подписи является следующее:
int Callback_Proc(stats_t stats, void *user, int final, int error, int code);
Делегат для обратного вызова имеет следующую подпись:
public delegate int Callback_Proc(stats_t stats, IntPtr user, Int32 final, Int32 error, Int32 code);
Я задаюсь вопросом, почему фиктивный элемент необходим для того, чтобы получить обратный вызов работать. Без манекена значение final было смещено на Ошибка, а значение Ошибка было смещено на . Спасибо за понимание и надеюсь, что мое объяснение имеет смысл.
Вы компилируете и выполняете как C++, так и C# процесс на одной и той же размерности ОС и компиляции? На первый взгляд, я мог бы предположить, что процесс C++ является 64-битным и 32-битным C#, поэтому IntPtr будет 4 байта против 8 байтов для C++ void *. – SledgeHammer
Возможно, вы находитесь на 64-битной системе, которая требует 64-битных квантов для структур? Есть ли причина, по которой вы не просто используете класс в C#? –
Оба C++ и C# используют один и тот же бит x86. Также есть отдельная сборка для x64 для C++ и C# кода. – rgeorg