最近需要联调甲方的接口,但是甲方动态链接库有嵌套数组。最开始查照了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个一维数组