ネイティブ DLL からエクスポートされた、次のような純粋な C インターフェイスを持つネイティブ関数があるとします。
// NativeDll.cpp
extern "C" void __stdcall FillArray(
    int fillValue, 
    int count, 
    int* data)
{
    // Assume parameters are OK...
    // Fill the array
    for (int i = 0; i < count; i++)
    {
        data[i] = fillValue;
    }
}
次の P/Invoke は正常に動作します (VS2010 SP1 でテスト済み)。
[DllImport("NativeDll.dll", CallingConvention=CallingConvention.StdCall)]
public static extern void FillArray(
    int fillValue,
    int count,
    [In, Out] int[] data
);
この P/Invoke と同様に、上記と同じですが、属性はありません:[In, Out]
[DllImport("NativeDll.dll", CallingConvention=CallingConvention.StdCall)]
public static extern void FillArray(
    int fillValue,
    int count,
    int[] data
);
では、これらの[In, Out]属性は配列をマーシャリングするためのオプションですか? もしあれば、彼らの目的は何ですか?P/Invoke 宣言でそれらを省略してもよろしいですか?