请帮忙看看C#调用非托管DLL中的函数无法从结构指针中返回值的问题
在VC++中结构定义:
typedef struct
{
int nDataNum; // 数据个数
double *pdData; // 存放数据数组
} PDData;
在VC++中函数定义:
int Test(..., PDData *pOutputData, ...) {}
在C#中相应结构定义:
[StructLayout(LayoutKind.Sequential)]
public class PDData
{
public int nDataNum;
public double[] pdData;
public PDData(double[] pdData)
{
this.pdData = pdData;
this.nDataNum = pdData.Length;
}
}
在C#中外部方法定义:
[DllImport("TestDll.dll")]
public static extern int PredictData(
...,
[MarshalAs(UnmanagedType.LPStruct)]
PDData pOutputData,
...);
在C#中调用该方法:(MAX_OUTPUT_DATA_NUM为常量)
PDData pOutputData = new PDData(new double[MAX_OUTPUT_DATA_NUM]);
Test(..., pOutputData, ...);
在VC++中对该Dll进行测试完全正确,pdData数组中都有值输出,但在C#中按上面的方法调用该Dll时也可以正常运行,也可以得到函数返回值,但pdData数组中没有值输出。
我还尝试以下几种方法:
在C#中将PDData定义成struct,并定义外部方法将pOutputData参数定义成ref;
在C#中定义外部方法将pOutputData参数定义成ref;
在C#中定义结构时将double[] pdData标识为[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_R8)];
在C#中定义结构时将double[] pdData标识为[MarshalAs(UnmanagedType.ByValArray, SizeConst=MAX_OUTPUT_DATA_NUM, ArraySubType=UnmanagedType.R8)];
在C#中定义结构时将double[] pdData标识为[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.R8, SizeConst=MAX_OUTPUT_DATA_NUM)];
...
但这些方法运行时都是出错,不是报内存不足就是报未将对象引用到实例,无比郁闷,请大家帮忙看看是什么地方出的问题,为什么结构中的数组的值传不回来?或者大家帮忙找个C#中调用非托管Dll中的带有返回对象参数的例子,谢谢