多重ポインタの実体を得る

あるIntPtrの変数ppに、構造体Tのポインタのポインタ、つまりC言語でいうところのT**が入っていたとします。このポインタからunsafeを使わずに実体の値を得る方法です。


確認までに、C言語ではこうなります (ppの型はT**とする)。

T t = **pp;


C#(というか.NET Framework)の場合は、*演算子をそのままMarshal.PtrToStructureに置き換えればOKです。

IntPtr p = (IntPtr)Marshal.PtrToStructure(pp, typeof(IntPtr));  // T* p = *pp;
T t = (T)Marshal.PtrToStructure(p, typeof(T));                  // T t = *p;

ちょっと高速化するとこうなります。

IntPtr p = Marshal.ReadIntPtr(pp);              // T* p = *pp;
T t = (T)Marshal.PtrToStructure(p, typeof(T));  // T t = *p;