オブジェクトの型を無理やり変更することに成功!
例えば Object 型のインスタンスの型を無理やり String 型に変更とかw
オブジェクトの型ってのは、オブジェクトヘッダー内に書き込まれている型ハンドルで識別されるだけなので、ここをアンマネージドコードで書き換えてやれば違う型のオブジェクトになってしまう。
具体的には、
- オブジェクトの GCHandle を生成
- GCHandle から、オブジェクトのアンマネージドポインタを取得
- オブジェクトのアンマネージドポインタはちょうど型ハンドルが書き込まれている部分を指しているので、そこを別の型ハンドルに書き換える
という手順。
問題は、非 blittable 型なオブジェクトをメモリ上で固定化することができないという制約。固定化してないと、処理中に GC が実行された時にアンマネージドポインタがオブジェクトを見失ってしまう。
詳しくはこちら