我将pjsip(C-lib)包装在c#中。
我的电话如下
var account = new pjsua_acc_config();
Accounts.pjsua_acc_config_default(account);
通过它可以解决这个问题;
[DllImportAttribute("pjsua.dll", EntryPoint = "pjsua_acc_config_default", CallingConvention = CallingConvention.Cdecl, PreserveSig = true)]
public static extern void pjsua_acc_config_default([In, Out] pjsua_acc_config cfg);
映射到
PJ_DEF(void) pjsua_acc_config_default(pjsua_acc_config *cfg)
这里* cfg是0x00a5e8a8
下一个电话是使用默认配置添加帐户,所以我打电话
int id = Constants.PJSUA_INVALID_ID;
Accounts.pjsua_acc_add(account, 1, ref id);
通过这个来解决问题;
[DllImportAttribute("pjsua.dll", EntryPoint = "pjsua_acc_add", CallingConvention = CallingConvention.Cdecl, PreserveSig = true)]
public static extern int pjsua_acc_add([In, Out]pjsua_acc_config acc_cfg, int is_default, ref int p_acc_id);
映射到
PJ_DEF(pj_status_t) pjsua_acc_add( const pjsua_acc_config *cfg, int is_default, int *p_acc_id)
这里* cfg是0x00a5e888,关闭32位。它们应该指向同一个地址,因为它是同一个对象。
但是,如果我改变了这个
public static extern void pjsua_acc_config_default([In, Out] pjsua_acc_config cfg);
到
public static extern void pjsua_acc_config_default([In, Out] pjsua_acc_config cfg, pjsua_acc_config dummy1, pjsua_acc_config dummy2);
地址对齐,任何人都知道造成这种情况的原因是什么?
答案 0 :(得分:1)
解决了这个问题,对Hans Passant的第一个回答很有帮助,除了手动编组我将pinvoke声明更改为IntPtr。
var account = new pjsua_acc_config();
var ptr = Marshal.AllocHGlobal(typeof(pjsua_acc_config));
Marshal.StructureToPtr(account, ptr, false);
Accounts.pjsua_acc_config_default(ptr);
Marshal.PtrToStructure(ptr, account);
... make my changes to object ...
Marshal.StructureToPtr(account, ptr, false);
int id = Constants.PJSUA_INVALID_ID;
Accounts.pjsua_acc_add(ptr, 1, ref id);