マーシャリングの事は殆ど何も分かってないんですが
IntPtrのアドレスから値を読んでいってArrayにコピーする作業を
[DllImport("win32.dll")]static extern void Foo(
 [Out,MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8, SizeConst = 2,SizeParamIndex = 0)]
 out double[] y
);
のような感じで書けないのでしょうか?