将一个Struct数组ByRef从C#传递给C ++并将其取回

时间:2018-04-24 18:29:38

标签: c# c++ dll interop dllimport

调用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;
}

我尝试了以下但没有成功:

  • [的MarshalAs(UnmanagedType.LPArray)]
  • [In,Out]
  • 阅读其他问题,但没有人有这个问题。

任何人都知道我错过了什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。

我从ref移除了DllImport,并将[MarshalAs(UnmanagedType.LPArray)][In, Out]装饰器放在MyStruct param中。

最后,我在C ++中改为void * paramStruct,最后全部工作了!