( - >アンマネージC ++管理C#の)タイプの配列へのポインタをマーシャリング
質問
私は自分のマネージコードで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);
あなたはushort
sの配列へのポインタを持っている場合:
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);
}
}
あなたはushort
sの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);
}
}
}
所属していません StackOverflow