618の言うとおりIntPtr構造体、つまりポインタ/ハンドル型でやるのが本道。
読み書きとかバイト配列との相互コピーとかメモリ確保とかはSystem.Runtime.InteropServices.Marshalクラスの各メソッドで行う。
面倒だから対象の関数にマッチするのを使うことも多いけどな。