多重ポインタの実体を得る
ある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;