( - >アンマネージC ++管理C#の)タイプの配列へのポインタをマーシャリング

StackOverflow https://stackoverflow.com/questions/1323206

  •  19-09-2019
  •  | 
  •  

質問

私は自分のマネージコードでshortの配列へのポインタを含む構造を表現する方法を上のセトリングいくつかの問題を抱えています。構造体は次のようになります:

typedef struct
{
    short size;
    unsigned short** shortValues;
} UnmanagedStruct;
shortValues」の

メモリは、アンマネージコードの内部に割り当てられている - したがって、そのフィールドは、単に短い値の配列へのポインタであっても、割り当てられたメモリは、発信者(管理コードから見られるように、間接の追加のレベルが加え)あまりにも。 「size」フィールドは、アレイ内の要素の数を表します。どのように私は、マネージコードでこれを表現するのですか?

私はその後、私は管理対象外の呼び出しが復帰した後の値にアクセスする方法を見つけ出すことができなかった、私はちょうどIntPtrにそれを渡すだろうと思ってます。

役に立ちましたか?

解決

危険なコードOKですか?

public unsafe struct UnmanagedStruct
{
    public short size;
    public ushort** shortValues;
}

[DllImport("example.dll")]
public static extern void GetUnmanagedStruct(out UnmanagedStruct s);

あなたはushortsの配列へのポインタを持っている場合:

public static unsafe void WriteValues()
{
    UnmanagedStruct s;
    GetUnmanagedStruct(out s);
    for (var i = 0; i < s.size; i++)
    {
        ushort x = (*s.shortValues)[i];
        Console.WriteLine(x);
    }
}

あなたはushortsのnullで終わる配列の配列を持っている場合:

public static unsafe void WriteValues()
{
    UnmanagedStruct s;
    GetUnmanagedStruct(out s);
    for (var i = 0; i < s.size; i++)
    {
        for (ushort* p = s.shortValues[i]; p != null; p++)
        {
            ushort x = *p;
            Console.WriteLine(x);
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top