【问题标题】:Problem in passing arrays from C# to C++将数组从 C# 传递到 C++ 的问题
【发布时间】:2010-03-09 05:57:45
【问题描述】:

我有一个应用程序,我需要将一个数组从 C# 传递到 C++ DLL。最好的方法是什么?我在 Internet 上进行了一些搜索,发现我需要使用 ref 从 C# 传递数组。相同的代码:

status = IterateCL(ref input, ref output);

输入和输出数组的长度为20。C++ DLL中对应的代码是

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

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

谢谢, 拉克什。

【问题讨论】:

    标签: c# c++


    【解决方案1】:

    你需要使用:

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • @ILya:是的,没必要。
      • @abatishchev 为什么没有 OutAttribute?我以为我们需要从 C++ 向 C# 返回一个值,但 InAttibute 只是一个方向。
      • 据我了解,从 OP 函数声明中,第一个参数仅为 In,第二个参数为 Out。虽然您可以为这两个参数指定两个属性,但我想它会被过度使用
      • @abatishchev,哦,你是对的!我必须更仔细地阅读。
      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2015-12-23
      相关资源
      最近更新 更多