繁体   English   中英

在C#中使用C ++ unsigned int * array

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM