この関数が存在しない理由は、実装が複雑であり、必要とする人がほとんどいないためだと思います。安全を期すために、ピン留めは推移的に機能するようにする必要があります。つまり、到達可能なオブジェクトのグラフ全体をピン留めする必要があります。でも、基本的にできないことではないようです。
たとえば、次のクラスがあるとします。
[StructLayout(LayoutKind.Sequential)]
class SomeObject
{
public SomeObject r;
}
次のように割り当てます。
SomeObject o = new SomeObject();
そして、あなたはそれを固定しようとします:
GCHandle oh = GCHandle.Alloc(o, GCHandleType.Pinned);
あなたは恐ろしいものを手に入れるでしょう:
Object contains non-primitive or non-blittable data.
わかりました、結構です、私はそれで暮らすことができます。しかし、.NET のガベージ コレクターの実装にアクセスできたとします。何が障害になるでしょうか?ここに私が見る障害があります:
- 循環参照。
- ガベージ コレクターをアプリのヒープ内のオブジェクトに制限する必要があります。
- 時間がかかる場合があります。
- 操作をアトミックにするのは難しい/苦痛です。
GC はすでにこれらの問題のいくつかに対処しなければならないように思えます。それで、私は何を忘れていますか?
注: 「何を達成しようとしていますか?」などと尋ねる前に、私の質問の目的はコードの調査であり、必ずしも C# に限定されるものではなく、必ずしも CLR に限定されるものでもありません。ランタイム自体のメモリをいじるのは、典型的なシナリオではないことを理解しています。いずれにせよ、これは純粋に推測的な質問ではありません。
注 2: また、マーシャリングについては気にしません。ピン留めだけが気になります。