0

昨日も似たような質問をしましたが、これは少し違います。構造体の配列を 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 をマーシャリングするにはどうすればよいですか?

ところで-この段階では、メモリリークには興味がありません。

4

1 に答える 1

1

私は C# の専門家ではありませんが、C++ 部分には Tri-struct へのポインターが渡されます。これは、C++ では動的配列のように割り当てて正しく埋めることができますが、方法がありません。 C の観点からは、呼び出し元 (C#) のポインターを変更する必要がありますが、コピーのみを取得し、元の参照は取得しないためです。

C++ では、あなたがしようとしていることに最も近いのは、プロトタイプをvoid Dll_TriArray(Tri *&tri)(コピーではなく参照で呼び出す) に変更することですが、それを C# とインターフェイスする方法がわかりません (おそらくDll_TriArray(ref triArray);)。

于 2013-06-14T12:15:57.970 に答える