P / Invoke结构由32位?

时间:2013-11-10 21:31:05

标签: c# c pinvoke

我将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);

地址对齐,任何人都知道造成这种情况的原因是什么?

1 个答案:

答案 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);