ググって最初のほうに出てくるサイトで char * 以外は全てマーシャってるので
てっきり IntPtr を駆使すると思い込んでました。
配列じゃないポインタ渡しは ref/out で何の造作もなく出来ました。
(マーシャル関連のコードを大量に書いていたのが馬鹿らしくなるほど)

んで配列ですが

// C++(x86)
extern "C" __declspec(dllexport) void test(long a[2]);

// C#
[DllImport("usrbatch.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void test(out int[] a);

int[] a = new int[2];
test(out a);

で、バイオレーションエラー出ちゃいます。。。