C#调用C++DLL时候C++方法形参有嵌套数组怎么解决

最近需要联调甲方的接口,但是甲方动态链接库有嵌套数组。最开始查照了C#和C++的类型参照表以为直接传一个C#的嵌套数组就可以,然后就出现了下面这个问题:

于是尝试了各种方法,包括用IntPtr存通用地址,但是发现传过去的参数不对。也尝试了ref var[,],同样的传入的参数也不对。最终找到个两个方法,

方法一:就是用C#的[In,Out]类型:

完美解决了问题。

下面贴出测试源码:

C++头文件

#pragma once

#define API_DELSPECKM _declspec(dllexport)

extern "C"
{
	API_DELSPECKM double Fun01(double value[1][3]);
}

C++主函数

#include <iostream>
#include "pch.h"
#include "Test.h"

double v;

double Fun01(double value[1][3])
{
	v = value[0][0] + value[0][1] + value[0][2];
	return v;
}

C#代码

using System;
using System.Runtime.InteropServices;

namespace UseDLL
{
    class Program
    {
        [DllImport("DLLTest01.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern double Fun01([In, Out] double[,] value);

        public static double[,] value = new double[1, 3] { { 1, 2, 3 } };
        static void Main(string[] args)
        {
            Console.WriteLine(Fun01(value));

            Console.ReadKey();
        }
    }
}

方法二:用C#的[MarshalAs]属性

using System;
using System.Runtime.InteropServices;

namespace UseDLL
{
    class Program
    {
        [DllImport("DLLTest01.dll", CallingConvention = CallingConvention.Cdecl)]
        //public static extern double Fun01([In, Out] double[,] value);
        public static extern double Fun01([MarshalAs(UnmanagedType.LPArray, SizeConst = 3)] double[,] value);

        public static double[,] value = new double[1, 3] { { 1, 2, 3 } };
        static void Main(string[] args)
        {
            Console.WriteLine(Fun01(value));

            Console.ReadKey();
        }
    }
}

方法三:微软官网看到的

具体原理大概就是把嵌套数组拆分出来SizeConst个一维数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值