C# 向 C++ DLL中传递结构体,包含二维数组,一维数组,VS2013下测试通过。

需求是这样的:

C++中需要结构体如下:

PS:使用的是MFC 静态 DLL工程!

//
struct HCNetConnectData
{
    //
    CHAR * HCNetServerIP;
    //
    INT    HCNetServerPort;
    //
    CHAR * HCNetServerUserName;
    //
    CHAR * HCNetServerPWD;
    //
    INT    *HCNetChannels;
    //
    INT    HCNetChannelSize;
    //类似于List<string>
    CHAR **FMSServerUrls;
    //
    INT    FMSServerUrlSize;
};

C#中对应结构体如下:

struct HCNetConnectData
{
    //
    public string HCNetServerIP;
    //
    public int HCNetServerPort;
    //
    public string HCNetServerUserName;
    //
    public string HCNetServerPWD;
    //
    public int[] HCNetChannels;
    //
    public int HCNetChannelSize;
    //
    public string[] FMSServerUrls;
    //
    public int FMSServerUrlSize;
};

调用方法:

C++:

TEST(HCNetConnectData data);

C# : 

 [DllImport("TEST.dll", CharSet = CharSet.Ansi)]
 static extern int TEST(HCNetConnectData data);

字符串都没有问题,但是在HCNetChannels属性和FMSServerUrls属性时都出现“读取或访问保护内存的错误!”.

纠结其原因主要是因为:

C#中传递的结构体和C++中结构体内存结构不匹配,string[]和CHAR ** ,int[]和INT*不匹配,细节就不在这里详细阐述了。

修改C++的结构体:

//
struct HCNetConnectData
{
    //
    CHAR * HCNetServerIP;
    //
    INT    HCNetServerPort;
    //
    CHAR * HCNetServerUserName;
    //
    CHAR * HCNetServerPWD;
    //
    INT  HCNetChannels[64];
    //
    INT    HCNetChannelSize;
    //类似于List<string>
    CHAR FMSServerUrls[64][50];
    //
    INT    FMSServerUrlSize;
};

修改C#的结构体:

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

struct HCNetConnectData
{
    //
    public string HCNetServerIP;
    //
    public int HCNetServerPort;
    //
    public string HCNetServerUserName;
    //
    public string HCNetServerPWD;
    //

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public int[] HCNetChannels;
    //
    public int HCNetChannelSize;
    //注意二维数组的声明方式,和C++略为不同。

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64 * 50)]
    public char[,] FMSServerUrls;
    //
    public int FMSServerUrlSize;
};

C#初始化代码:           

            int channelSize = 64;
            HCNetConnectData data = new HCNetConnectData();
            data.FMSServerUrls = new char[channelSize, 50];
            //第一个地址
            char[] urlByte = "rtmp://192.168.1.109/live/camera1".ToCharArray();
            for (int i = 0; i < urlByte.Length; i++)
            {
                data.FMSServerUrls[0, i] = urlByte[i];
            }
            //第二个地址
            urlByte = "rtmp://192.168.1.109/live/camera2".ToCharArray();
            for (int i = 0; i < urlByte.Length; i++)
            {
                data.FMSServerUrls[1, i] = urlByte[i];
            }

            data.HCNetChannels = new int[channelSize];
            for (int i = 0; i < channelSize; i++)
            {
                //初始化值
                data.HCNetChannels[i] = -1;
            }
            data.HCNetChannels[0] = 1;
            data.HCNetChannels[1] = 2;

运行效果:

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三项超标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值