I am trying to find the correct PInvoke signature for the following C code. I already tried several variants but I always get a stack unbalanced exception.
typedef struct oem_device
{
unsigned int number_sensor_width;
unsigned int number_sensor_height;
float sensor_surface_cm2;
char* serial;
char* id;
char* bootloader_firmware;
char* micro_firmware;
char* cpld_firmware;
char* wifi_firmware;
char* hardware_version;
}OEM_DEVICE ;
typedef struct oem_device_manager
{
void (*device_has_connected)(OEM_DEVICE device_connected);
void (*device_has_disconnected)(OEM_DEVICE device_disconnected);
void (*device_status_update)(OEM_DEVICE device, unsigned int status);
void (*device_acquisition_available)(OEM_DEVICE device, unsigned int* millisecond, unsigned int size);
}*P_OEM_DEVICE_MANAGER,OEM_DEVICE_MANAGER;
bool register_device_manager(P_OEM_DEVICE_MANAGER manager);
I tried the following C# code
[StructLayout(LayoutKind.Sequential)]
public struct oem_device
{
uint number_sensor_width;
uint number_sensor_height;
float sensor_surface_cm2;
IntPtr serial;
IntPtr id;
IntPtr bootloader_firmware;
IntPtr micro_firmware;
IntPtr cpld_firmware;
IntPtr wifi_firmware;
IntPtr hardware_version;
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void device_has_connectedD(oem_device device_connected);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void device_has_disconnectedD(oem_device device_disconnected);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void device_status_updateD(oem_device device, uint status);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void device_acquisition_availableD(oem_device device, ref uint millisecond, uint size);
[StructLayout(LayoutKind.Sequential)]
public struct oem_device_manager
{
[MarshalAs(UnmanagedType.FunctionPtr)] public device_has_connectedD device_has_connected;
[MarshalAs(UnmanagedType.FunctionPtr)] public device_has_disconnectedD device_has_disconnected;
[MarshalAs(UnmanagedType.FunctionPtr)] public device_status_updateD device_status_update;
[MarshalAs(UnmanagedType.FunctionPtr)] public device_acquisition_availableD device_acquisition_available;
}
[DllImport(@"OEM_DLL.dll")]
public static extern bool register_device_manager(oem_device_manager manager);
But when I call the register_device_manager I always get a stack unbalanced exception.