调用CPP dll时,我遇到了一个非常奇怪的问题。
我可以调用传递struct数组(有多个位置)的方法编组并循环它并将数据设置为它。但是当代码回到C#时,数组只有一个位置。
例如,我创建了一个带有3个位置(0,1,2)的结构数组,在C ++ Dll中我接收整个数组并且不执行任何操作,并且当执行返回到C#Caller时,数组在阵列上只有一个位置,第一个项目。
代码:
C ++方面:
extern "C" __declspec(dllexport) int ViewItems(int * nTotalItems, void ** paramStruct)
{
// TODO nothing here.
return 1;
}
C#方:
[DllImport(@"MyCustomLib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int ViewItems(ref int resultItemsCount, ref MyStruct[] MyStruct);
调用:
var resultSize = 3;
var resultStruct = new MyStruct[3];
for (int i = 0; i < resultSize; i++)
{
resultStruct[i].SomePropValue = i+2;
}
// Before this, the resultStruct.Lenght is 3
var resultCall = ViewItems(ref resultSize, ref resultStruct);
// After this, the resultStruct.Lenght is
STRUCT:
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
public int SomePropValue;
}
我尝试了以下但没有成功:
任何人都知道我错过了什么?
提前致谢!
答案 0 :(得分:0)
我解决了这个问题。
我从ref
移除了DllImport
,并将[MarshalAs(UnmanagedType.LPArray)]
和[In, Out]
装饰器放在MyStruct
param中。
最后,我在C ++中改为void * paramStruct
,最后全部工作了!