# c++ c#结构体调用

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/21895.html | 发布：2023-07-07 | 更新：2023-07-07 | 分类：建站教程

**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);

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
