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 件のコメント:
コメントを投稿