C#调用

1、最近做项目遇到,C#调用C++dll里的函数需要传递结构体参数,发现这个并不是简单的在C#里定义相应的结构体就可以的,下面以一个例子来说明解决的办法,C++中的函数和结构体如下:

uint msec_set_igr_gen_cfg(int port, IGR_GEN_T *igr_gen)
{

return 0;
}

typedef struct {
  int aa_disable; /*/< authentiation adjust checking disable */
  int badtag_rej; /*/< reject packet if it is bypassed due to badtag */
  int pad_en; /*/< pad non-rejected packets up to 64B */
  int byp_ctl_sl; /*/< bypass packet if SL field does not correspond to packet len */
  int byp_ctl_v; /*/< bypass packet if V bit is set */
  int byp_ctl_sc; /*/< bypass packet if SC bit and either ES or SCB bits are set */
  int byp_ctl_ec; /*/< bypass packet if DC bits are not 00 or 11 */
  int sectag_flag; /*/< select which flag bit indicates that a SEC tag was present in pkt */
} IGR_GEN_T;

在C#中 首先需要使用Dllimport将相应的C++dll load进来,然后定义相应的结构体,具体如下:

        [DllImport("..\\debug\\mgd_MacSec.dll")]
        private static extern UInt32 msec_set_igr_gen_cfg(int port, IntPtr igr_gen);

  

        结构体定义:

    [StructLayout(LayoutKind.Sequential)]
     public class IGR_GEN_T 
     {
         int aa_disable; /*/< authentiation adjust checking disable */
         int badtag_rej; /*/< reject packet if it is bypassed due to badtag */
         int pad_en; /*/< pad non-rejected packets up to 64B */
         int byp_ctl_sl; /*/< bypass packet if SL field does not correspond to packet len */
         int byp_ctl_v; /*/< bypass packet if V bit is set */
         int byp_ctl_sc; /*/< bypass packet if SC bit and either ES or SCB bits are set */
         int byp_ctl_ec; /*/< bypass packet if DC bits are not 00 or 11 */
         int sectag_flag; /*/< select which flag bit indicates that a SEC tag was present in pkt */
         public IGR_GEN_T()
         {
             aa_disable = 0;
             badtag_rej = 0;
             pad_en = 0;
             byp_ctl_ec = 0;
             byp_ctl_sc = 0;
             byp_ctl_sl = 0;
             byp_ctl_v = 0;
             sectag_flag = 0;
         }
     } ;

  在代码中具体引用函数时如下所示,

     IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(igr_gen));
             Marshal.StructureToPtr(igr_gen, ptr, false);
             UInt32 ret = _msec_set_igr_gen_cfg(port, ptr);
             igr_gen = (IGR_GEN_T)Marshal.PtrToStructure(ptr, typeof(IGR_GEN_T));
             Marshal.FreeHGlobal(ptr);
             return ret;

从以上步骤可以看出,结构体参数的传递需要marshal做辅助做相应的转化,以intptr的方式传输结构体参数。

文章链接: https://www.mfisp.com/21894.html

文章标题:C#调用

文章版权:梦飞科技所发布的内容,部分为原创文章,转载请注明来源,网络转载文章如有侵权请联系我们!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
建站教程

c++ c#结构体调用

2023-7-7 14:39:48

建站教程

c++ c#结构体调用

2023-7-7 14:45:58

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索

梦飞科技 - 最新云主机促销服务器租用优惠