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

来源:互联网 发布:肇庆单片机工程师招聘 编辑:程序博客网 时间:2024/05/24 23:16

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

C/C++ code

 

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

//服务器信息

typedefstruct 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; 

    constchar *pcUserName;      

    constchar *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)]

       publicstruct TServerInfo

       {   

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

           publicchar[] csStrMIP;

       }

 



刚自己写的试验代码

C/C++ code

 

typedefstruct tagSvrInfo

{

 char csStrMIP[3][16];

}TSvrInfo,*LPSvrInfo

 

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

PIDLL_APIvoid 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")]

       staticexternint Login(ref SvrInfo info);

 

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

       publicstruct SvrInfo

       {

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

           publicchar[] csStrMIP;

       }

 

       staticvoid Main(string[] args)

       {

           SvrInfo si = new SvrInfo();

           si.csStrMIP = newchar[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

原创粉丝点击