C# 发中调用一个采用C++封装好的dll, 其结构体中的二维数转换

14 篇文章 0 订阅

想在C# WinForm开发中调用一个采用C++封装好的dll, 但其结构体中的二维数组不知道应当如何转换, 网上搜索了一把P/Invoke资料相对来说比较少, 没有找到切实有用的文章, 现在调用虽不会报错了, 但没有产生预期效果.

C/C++ code

 

#define MAX_STRM_LAYER 3  // 最多几级流媒体

//服务器信息

typedef struct tagServerInfo

{

     long uID;                     

     char csStrMIP[MAX_STRM_LAYER][16];  // 这个不知道如何转换      

     unsigned short nStrMPort[MAX_STRM_LAYER]; 

 

     char csDdtIP[16];            

     unsigned short nDdtPort;     

     unsigned short bIsWebUser;   

 

     unsigned short protocolType; 

     const char *pcUserName;      

     const char *pcPassword;      

 

     char csStoreFileSvrIP[16];        

     unsigned short nStoreFileSvrPort; 

 

     char csDevFileSvrIP[16];          

     unsigned short nDevFileSvrPort;   

 

}TServerInfo, *LPServerInfo;

 

LONG __stdcall StrM_Login(LPServerInfo mts, int iLayer = 1);

 

 

 

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct TServerInfo
        {
            public int uID;
 
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3 * 16)]
            public char[] csStrMIP;
 
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)] // 这里原先忘记指定了
            public ushort[] nStrMPort;
 
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string csDdtIP;
 
            public ushort nDdtPort;
 
            public ushort bIsWebUser;
 
            public ushort protocolType;
 
            public string pcUserName;
 
            public string pcPassword;
 
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string csStoreFileSvrIP;
 
            public ushort nStoreFileSvrPort;
 
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
            public string csDevFileSvrIP;
 
            public ushort nDevFileSvrPort;
        }

 

 

测试代码:

 

C++的多维数组,转成C#的一维数组处理

C# code

 

        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

        public struct TServerInfo

        {   

            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3*16]

            public char[] csStrMIP;

        }

 



刚自己写的试验代码

C/C++ code

 

typedef struct tagSvrInfo

{

  char csStrMIP[3][16];

}TSvrInfo,*LPSvrInfo

 

//assign char value 'a','b','c'

PIDLL_API void Login(LPSvrInfo info)

{

    info->csStrMIP[0][0] = 'a';

    info->csStrMIP[1][0] = 'b';

    info->csStrMIP[2][0] = 'c';

}

 

extern "C"

{

   PIDLL_API void Login(LPSvrInfo info);

};

 

 

 

C# code

 

        [DllImport("pidll.dll")]

        static extern int Login(ref SvrInfo info);

 

        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

        public struct SvrInfo

        {

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 * 16)]

            public char[] csStrMIP;

        }

 

        static void Main(string[] args)

        {

            SvrInfo si = new SvrInfo();

            si.csStrMIP = new char[48];

 

            Login(ref si);

 

            Console.WriteLine(si.csStrMIP[0]);

            Console.WriteLine(si.csStrMIP[16]);

            Console.WriteLine(si.csStrMIP[32]);

        }

 

        /*---------------输出为----------

        a

        b

        c

        ------------------------------*/

 文献来源:http://topic.csdn.net/u/20100915/22/5861d644-d3e9-43eb-9168-b19e7287dc43.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值