【问题标题】:Passing an array of unknown size of structs from c# to c++ dll and back将未知大小的结构数组从 c# 传递到 c++ dll 并返回
【发布时间】:2013-06-14 10:29:03
【问题描述】:

我昨天问了一个类似的问题,但这略有不同。我在将 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# 代码,再次从结构开始:

[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 编组到结构数组中/从结构数组中编组?

顺便说一句 - 在这个阶段,我对内存泄漏不感兴趣。

【问题讨论】:

  • BTW - at this stage, i'm not interested in memory leaks. 在您的开发过程中的任何点采取这种立场都是危险的。
  • CLR应该如何知道数组的大小?

标签: c# c++ arrays struct


【解决方案1】:

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

在 C++ 中,最接近您要做的事情是将原型更改为 void Dll_TriArray(Tri *&amp;tri)(通过 ref 调用,而不是通过副本调用),但我不确定如何与 C# 接口(可能Dll_TriArray(ref triArray);)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 2018-11-07
    • 1970-01-01
    • 2013-05-03
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多