从C#传递数组到C++中存在问题

3

我有一个应用程序,需要从C#传递一个数组到C++ DLL。最好的方法是什么?我在互联网上搜索了一下,发现我需要使用ref从C#传递数组。代码如下:

status = IterateCL(ref input, ref output);

输入和输出数组的长度为20。相应的C++ DLL代码如下:

IterateCL(int *&inArray, int *&outArray)

这对于一次操作来说是可以正常工作的。但是如果我尝试从C#中循环调用该函数第二次,那么输入数组在C#中将显示为一个元素的数组。为什么会发生这种情况,请帮助我如何从C#中迭代调用此函数。

谢谢, Rakesh。

2个回答

2

我不确定,但可以尝试使用 fixed

fixed (int* arr1 = new int[10], arr2 = new int[10])
{
            //acting with arr1 arr2 as you wish
}

或者您可以使用编组技术。
[DllImport("your_dll")]
public extern void IterateCL([In, MarshalAs(UnmanagedType.LPArray)] int[] arr1, [Out, MarshalAs(UnmanagedType.LPArray)] int[] arr2);

1
@ILya:是的,这并不是必要的。 - abatishchev
@abatishchev 为什么不用 OutAttribute?我原以为我们需要从 C++ 中返回一个值到 C#,但是 InAttribute 只有单向性。 - ILya
就我对 OP 函数声明的理解,第一个参数仅为输入,第二个参数为输入输出。虽然你可以为两个参数都指定这两个属性,但我认为这样做会有些过度使用。 - abatishchev
@abatishchev,噢,你说得对!我必须更仔细地阅读。 - ILya

2

您需要使用:

[DllImport("your_dll")]
public extern void IterateCL([In, MarshalAs(UnmanagedType.LPArray)] int[] arr1, [Out, MarshalAs(UnmanagedType.LPArray)] int[] arr2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接