COMとdynamicとMarshal.ReleaseComObjectと
さて、今までの記事で「楽するため」と称してC#4.0の"dynamic"キーワードを使ってCOMを使った処理をこんな風に書いてきたわけですが、
// Shell.Applicationオブジェクトの作成 dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application")); ... shellApplication = null;
ふと「Marshal.ReleaseComObject()はホントに不要でいいのか」と思っていろいろ調べたら衝撃の事実が…
- DLR の COM バインダーに対する考察
- dynamicとCOMとメモリ リーク
- Marshal.ReleaseComObjectは危険な場合がある
- Discussion of Marshal.ReleaseComObject and its dangers
これらの記事の内容をまとめると、
- C#4.0のdynamicを使ったからといってCOMの解放まで不要になったわけじゃない
- だけどMarshal.ReleaseComObject()の不用意な呼び出しは危険だから極力するな
うーむ、自分のような凡人の頭では「で、どうすりゃいいの?」です(^^;;