[英]use c++ unsigned int *array in c#
我有一个c ++ .dll导出具有以下签名的函数:
extern int __stdcall foobar(long ptr, unsigned int *array, unsigned int arraySize);
从c ++代码中,我可以像这样使用它:
std::vector<unsigned int> FooBar(6);
int res = foobar(ptr, &FooBar[0], (unsigned int)FooBar.size());
我想使用C#中的dll,并尝试了以下方法:
[DllImport("mydll.dll")]
public static extern int foobar(long ptr, uint[] arr, uint arrSize);
呼叫:
uint[] arr = new uint[6];
int count = Obj.foobar(ptr, arr, (uint)arr.GetLength(0)*32)
这将引发“ PInvokeStackImbalance”错误。 正确的PInvoke签名会是什么样?
您需要为数组参数使用MarshalAs属性。 这实际上是向封送系统描述了如何在C#托管类型和原始C ++函数参数之间进行转换。
[DllImport("mydll.dll")]
public static extern int foobar(
IntPtr ptr, //Need more details on this parameter
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=2)] uint[] arr,
uint arrSize);
您的“ ptr”参数有点令人困惑,因为您的问题中没有提到它,但是很可能您可以将其视为常规的旧C ++指针,在这种情况下,IntPtr是合适的类型。
在MarshalAs属性中,我们告诉编组系统将您的“ uint数组”转换为原始的,长指针兼容的C ++数组。 在转换期间分配数组的大小时,SizeParamIndex告诉它使用“ arrSize”参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.