2、还存在另外一种情况,是结构体中嵌套有结构体时需要做一些特殊处理,具体如下:
结构体
typedef struct {
int ctx_num; /*/< Index to the context to use */
int sec_level; /* < Security Level to validate frames per context based */
int drop_maxpn; /* < Enable packet drop when max pn is reached for this context>*/
int drop; /*/< Drop this Packet */
int redir; /*/< For Egress, redirect the packet to ingress path (NDL). For Ingress, redirect the packet to alternate destination. */
int auth_en; /*/< Encapsulate and authenticate this packet. */
int enc_en; /*/< Encrypt this packet. auth_en must also be set when this bit is set. (Valid only for egress path). */
} ACT_FLD;
typedef struct {
ACT_FLD *lk_act_fld; /*/< Action to take for an entry within a port */
} LKUP_T;
C++ 函数
uint msec_port_set_egr_entry (IN int port, IN int ent_num, IN LKUP_T *egr_lkup)
{
//
}
C#在调用时首先将相应dll import进来,进行相应结构体的定义和相应函数的声明,具体如下:
[DllImport("..\\debug\\mgd_MacSec.dll")]
private static extern UInt32 msec_set_igr_gen_cfg(int port, IntPtr igr_gen);
[StructLayout(LayoutKind.Sequential)]
public class ACT_FLD
{
public int ctx_num; /*/< Index to the context to use */
public int sec_level; /* < Security Level to validate frames per context based */
public int drop_maxpn; /* < Enable packet drop when max pn is reached for this context>*/
public int drop; /*/< Drop this Packet */
public int redir; /*/< For Egress, redirect the packet to ingress path (NDL). For Ingress, redirect the packet to alternate destination. */
public int auth_en; /*/< Encapsulate and authenticate this packet. */
public int enc_en; /*/< Encrypt this packet. auth_en must also be set when this bit is set. (Valid only for egress path). */
public ACT_FLD()
{
ctx_num = 0;
sec_level = 0;
drop_maxpn = 0;
drop = 0;
redir = 0;
auth_en = 0;
enc_en = 0;
}
}
[StructLayout(LayoutKind.Sequential)]
public class LKUP_T
{
public IntPtr lk_act_fld;
public LKUP_T()
{
ACT_FLD lk_act_fld_s = new ACT_FLD();
lk_act_fld = Marshal.AllocHGlobal(Marshal.SizeOf(lk_act_fld_s));
Marshal.StructureToPtr(lk_act_fld_s, lk_act_fld, false);
}
}
具体在代码中引用时如下所示:
IntPtr egr_lkup_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(egr_lkup));
Marshal.StructureToPtr(egr_lkup, egr_lkup_ptr, false);
uint ret = _msec_port_set_egr_entry(port, ent_num, egr_lkup_ptr);
egr_lkup = (LKUP_T)Marshal.PtrToStructure(egr_lkup_ptr, typeof(LKUP_T));
Marshal.FreeHGlobal(egr_lkup_ptr);