Здравствуйте, помогите разобраться со следующей проблемой — далее код куска плагина который я пишу: код на C++ работает, а на C# — нет. Вопрос — почему?
C++
typedef int (*ttkCallback)(int windowID, char *subwindow, char *event, void *data, void *userData);
typedef int (*plugin_function_send)(char *guid, char *event, void *data);
struct account_entry_t
{
unsigned int struct_size;
char *account;
char *medium;
char *status;
char *section;
int connected;
long last_connected;
HICON icon;
HWND window;
ttkCallback callback;
void *data;
}
plugin_function_send plugin_send;
auto *ae = (struct account_entry_t *)data;
ae->callback = (ttkCallback)accountAdd_callback;
plugin_send(GUID, "accountsAddRequest", ae);
C#
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public delegate int ttkCallback(int windowID, string subwindow, string eventname, [In, Out]IntPtr data, IntPtr userData);
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal delegate int plugin_function_send(string guid, string eventname, [In, Out, MarshalAs(UnmanagedType.AsAny)]object data);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct account_entry_t
{
[MarshalAs(UnmanagedType.U4)]
uint struct_size;
[MarshalAs(UnmanagedType.LPStr)]
string account;
[MarshalAs(UnmanagedType.LPStr)]
string medium;
[MarshalAs(UnmanagedType.LPStr)]
string status;
[MarshalAs(UnmanagedType.LPStr)]
string section;
[MarshalAs(UnmanagedType.I4)]
int connected;
[MarshalAs(UnmanagedType.I8)]
long last_connected;
[MarshalAs(UnmanagedType.SysInt)]
IntPtr icon;
[MarshalAs(UnmanagedType.SysInt)]
IntPtr window;
[MarshalAs(UnmanagedType.FunctionPtr)]
public ttkCallback callback;
[MarshalAs(UnmanagedType.SysInt)]
IntPtr data;
}
internal plugin_function_send plugin_send;
var ae = (account_entry_t)Marshal.PtrToStructure(data, typeof(account_entry_t));
ae.callback = accountAdd_callback;
plugin_send(GUID, "accountsAddRequest", ae);