都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

COMの解放処理について

COMの解放処理に関してです。

通常.NETのフレームワークからCOMを呼び出した場合は、System.Runtime.InteropServices.Marshal.ReleaseComObjectを使用してCOMオブジェクトの参照カウントを減らし、解放処理を行なっていたかと思います。

 

しかし、SilverlightになるとSystem.Runtime.InteropServices.Marshal.ReleaseComObjectメソッドは存在しません。どうすればいいかというと、下記の通りになります。

 

例)Wordを起動する。

//AutomationFactoryを使用して、ワードオブジェクトを生成

dynamic word = AutomationFactory.CreateObject("Word.Application");

//画面を表示

word.Visible = true;

//終了メソッドの呼び出し

word .Quit();

//Disposeメソッドの呼び出し。(ここがミソ。wordはIDisposableを実装しているので)

((IDisposable)word ).Dispose();

//nullを指定

word = null;

 

これでSilverlightからも安全にCOMのオブジェクトを解放することが可能です。