将一个未知大小的结构数组从c#传递给c ++ dll并返回

时间:2013-06-14 10:29:03

标签: c# c++ arrays struct

昨天我问了一个类似的问题,但这有点不同。我在将结构数组从c#传递给c ++时遇到了问题,并将其重新传回。

这是c ++代码。首先,结构:

struct Tri
{
   public:
     int v1, v2, v3;
}

现在是c ++ dll部分:

extern "C" __declspec(dllexport) void Dll_TriArray(Tri *tri)
{
   int num = 10;
   tri = new Tri[num];

   for (int i = 0; i < num; i++)
   {
      tri[i].v1 = i + 5;
      tri[i].v2 = i + 10;
      tri[i].v3 = i + 25;
   }
}

这里是c#代码,再次从struct开始:

[StructLayout(LayoutKind.Sequential)]
public struct Tri
{
   public int v1, v2, v3;
}

public class Testing
{
   [DllImport("testing.dll")]
   static extern void Dll_TriArray(out Tri[] tryArray);

   public GetTriArray()
   {
      Tri[] triArray;
      Dll_TriArray(out triArray);
   }
}

因此,调用GetTriArray方法时得到的triArray将返回null。我已经考虑过将IntPtr作为参数传递,但是如何将一个intptr编组到一个struct数组中?

BTW - 在这个阶段,我对内存泄漏不感兴趣。

1 个答案:

答案 0 :(得分:1)

我不是C#中的专家(无论如何),但是C ++部分传递了一个指向Tri-struct的指针,它在C ++中可以像你分配的动态数组一样使用,并且你没有正确填充有办法让它回来,因为从C-perspective你需要修改调用者的(C#)指针,但你只得到一个副本而不是对原始的引用。

在C ++中,最接近你要做的事情就是将原型更改为void Dll_TriArray(Tri *&tri)(通过ref调用,而不是通过复制调用)但我不确定如何将其与C#进行交互(可能是Dll_TriArray(ref triArray);)。