我在调用 CPP dll 时遇到一个非常奇怪的问题。
我可以调用传递一个结构数组(具有多个位置)的方法,编码并循环它并为其设置数据。但是当代码返回到 C# 时,数组只有一个位置。
例如,我创建了一个包含 3 个位置 (0, 1, 2) 的结构数组,在 C++ Dll 中我接收了整个数组但不对其进行任何操作,当执行返回到 C# 调用程序时,数组在数组中只有一个位置,即第一项。
代码:
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
结构:
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
public int SomePropValue;
}
我尝试了以下但没有成功:
- [MarshalAs(UnmanagedType.LPArray)]
- [进,出]
- 阅读其他问题,但没有一个有这个问题。
有人知道我错过了什么吗?
提前致谢!
最佳答案
我解决了这个问题。
我从 DllImport
中删除了 ref
并将 [MarshalAs(UnmanagedType.LPArray)]
和 [In, Out ]
MyStruct
参数中的装饰器。
最后,我在C++中改成了void * paramStruct
,终于全部成功了!
关于c# - 将结构数组 ByRef 从 C# 传递到 C++ 并将其取回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50008590/