2011年7月13日水曜日

dynamicとCOMとメモリ リーク

C#から(「CLR上から」と言った方が良いかもしれないが)COMインタフェースを用いる場合には細心の注意を払う必要がある.

今回発生した問題は,Microsoft Internet Controls(SHDocVw名前空間)およびMicrosoft HTML Object Library(mshtml名前空間)を用いてInternet Explorerと相互作用するソフトウェアを開発している際に発生したメモリ リークである.

リークの直接的原因は,dynamicを用いてCOMインタフェースを管理したことにあったようだ.

メモリリークを起こすコード

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
dynamic doc = ie.Document;
Marshal.ReleaseComObject(doc);
Marshal.ReleaseComObject(ie);

メモリリークを起こさない(と思われる)コード

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
mshtml.IHTMLDocument2 doc = ie.Document;
Marshal.ReleaseComObject(doc);
Marshal.ReleaseComObject(ie);

COMインタフェースのプロパティやメソッドの戻り値がdynamicだからと言って,dynamic(あるいはvar)を用いないように注意する必要がありそうだ.

参考:dynamic(C# によるプログラミング入門)ReleaseComObject(cbrumme's WebLog)

0 件のコメント:

コメントを投稿