0

マネージコード内のshortの配列へのポインターを含む構造体を表現する方法を決めるのに問題があります。構造体は次のようになります。

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

''のメモリshortValuesはアンマネージコード内に割り当てられます。したがって、そのフィールドは単に短い値の配列へのポインタですが、割り当てられたメモリが呼び出し元(マネージコード)にも表示されるように、追加レベルの間接参照が追加されました。' size'フィールドは、配列内の要素の数を表します。これをマネージコードで表現するにはどうすればよいですか?

を渡すだけだと思っていIntPtrたのですが、アンマネージコールが戻ってきたら、値にアクセスする方法がわかりませんでした。

4

1 に答える 1

0

安全でないコードは大丈夫ですか?

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

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

sの配列へのポインタがある場合ushort

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);
    }
}

sのnullで終了する配列の配列がある場合ushort

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);
        }
    }
}
于 2009-08-24T16:05:19.817 に答える