Metafile クラスを Stream で作成すると…

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

物凄い単純な再現プログラムを構築すると……ちゃんと動くんだけどなあ。*3

*1:GCRoot

*2:System.Drawing.Internal.GPStream、これは System.IO.Stream に対する IStream wrapper

*3:問題の出ているアプリケーションでは、プロファイラでみると Live なところに GPStream が全部残ってるっぽい