リソース管理の原則と超原則

世間では原則論が大繁盛です.

  • finally 句で確実に終了処理を行うべきだ
  • using 構文ででリソースリークを回避すべきだ
  • Marshal.ReleaseComObject で参照カウントをきちんと管理すべきだ

しかし,結局のところこれらは .NET 的ユーザ空間というかお客様空間の世界の話です.using 構文でもタイミングによっては Dispose メソッドが呼ばれないことはありますし,上で見たように finally 句の実行だって絶対ではありません.
スレッドがたとえ finally 句にあっても強制終了を行うような最終手段を欲しつつ,それでもなおリソースリークを避けたいというのはもうほとんど反則というか,世界法則そのものを支配する一段上の存在の役目です.
.NET 2.0 で追加された CriticalFinalizerObject や Constrained Execution Regions,そして新しく区別されるようになった通常終了と強制終了の違いなどは,こういった OS 並のリソース管理のプロトコル .NET 側に移管する (あるいは再構築する) 試みの 1 つと言えるでしょう.
デバッグ中の DirectX アプリケーションを強制終了してもリソースリークが起きないというのは,誰の苦労もなく得られているものではありません.そういったどろどろした部分に目を背けつつ,.NET OS などというものに本気で期待するというのも,ある意味残酷な話かなと思うことはありますね.