.NET の配列は、連続したメモリで表されます。つまり、メモリ内では、要素 0 の後、要素 1 が前の要素の直後、というように続きます。
で配列を固定すると、要素のリスト全体もメモリに固定され、アンマネージ コードで処理できることをGCHandle.Alloc
意味します。
ただし、あなたが言及したように、型が blittable 型である場合にのみ意味があります (技術的には、これは真実ではありません。型がアンマネージ コードにマーシャリングできる場合ですが、blittable 間には多くの重複があります)。 P/Invoke/COM 相互運用層が自動的に処理する主要な型ともの)。
したがって、値型の配列がある場合は、呼び出すことができGCHandle.Alloc
、配列が固定されます。ただし、P/Invoke レイヤーが既にこれを行っているので、気にする必要はありません。
配列が参照でいっぱいの場合、それを管理されていないコードにマーシャリングしても意味がありません。すべての参照を固定したとしても、型システムは参照がメモリ内で指している .NET 型をサポートしていないため、アンマネージ コードはメモリ内のその参照をどう処理するかわかりません。
.NET のクラスが本当にネイティブ構造のラッパー/.NET 表現である場合は、.NET でその構造の配列を作成し、すべてのデータをそこにコピーしてから、ネイティブ コードに送信することをお勧めします。 .
または、クラスを C++/cli で記述して、ネイティブ コードで .NET メンバーへのアクセスを容易にすることもできます。