Metafile クラスを Stream で作成すると…
どうにも回収されないメモリが……と、調査をすすめたところ System.Drawing.Imaging.Metafile クラスにたどり着いた。
このクラスはバックストアストーレジとしてファイルや HENHMETAFILE といったものが指定できるのだが、そのうち System.IO.Stream を指定したもの (GDI+ で IStream* になっているもの) がアヤシイ、バックストアストーレジに設定した Stream が破棄されないのだ。
たとえば MemoryStream を設定している場合、参照関係をたどるとどうも CCW*1 → GPStream*2 → MemoryStream となっていて、COM 側から参照カウンタがデクリメントされないのが問題っぽいけど……CCW の AddRef/Release って簡単にログれたっけ?
物凄い単純な再現プログラムを構築すると……ちゃんと動くんだけどなあ。*3