2009-09-03 19 views
5

これは、 How to properly clean up excel interop objects in c#への質問です。C言語でinteropオブジェクトを正しくクリーンアップする方法

Excelネームスペース内で連鎖呼び出し(ExcelObject.Foo.Bar()など)を併用すると、COMオブジェクトのガーベジコレクションが行われなくなります。代わりに、使用する各COMオブジェクトへの参照を明示的に作成し、Marhsal.ReleaseComObject()を使用して明示的に解放する必要があります。

Excel COMオブジェクトに固有の連鎖呼び出し後にCOMオブジェクトを解放しないという動作はありますか? COMオブジェクトが使用されているときはいつも、この種のパターンを適用するのは難しいですか?

答えて

6

多くの他のCOMライブラリよりも、Officeアプリケーションを扱う際には、リリースを適切に処理することが重要です。理由は2つあります。

  1. Officeアプリケーションは、プロセス外のサーバーとして実行され、インプロセスライブラリでは実行されません。正しくクリーンアップできない場合は、プロセスを実行したままにしておきます。
  2. Officeアプリケーション(特にExcel IIRC)は、COMオブジェクトへの未処理の参照がある場合、Application.Quitを呼び出しても正しく終了しません。

通常のin-proc COMライブラリの場合、正常にクリーンアップできないという結果はそれほど劇的ではありません。あなたのプロセスが終了すると、すべてのin-procライブラリはそれを取り去ります。不要になったオブジェクトに対してReleaseComObjectを呼び出すことを忘れると、オブジェクトが最終化されたときに最終的に処理されます。

これは、これは不正なコードを書く言い訳ではないと言いました。

+0

非常に良い点RE:オフィスの相互運用性オブジェクトをクリーンアップする必要がある理由 –

2

COMオブジェクトは基本的に管理されていないコードです。管理対象アプリケーションからアンマネージコードを呼び出すとすぐに、そのアンマネージコードの後に​​クリーンアップするのはユーザーの責任となります。

要するに、上記投稿にリンクされたパターンは、すべて COMオブジェクトのために必要です。

+0

...「必要な」という定義があります。プロセスのシャットダウン(またはアプリケーションドメインのアンロード、それが最初に起こる場合)では、まだ破壊されていないすべてのRCW(ランタイム呼び出し可能ラッパー)がリリースされると思います。残念なことに、それらの周りに強力な保証はありません。適切に破壊され、すべてのファイナライザが実行されます。とりわけ、COMオブジェクトの破棄に2秒以上かかる場合、CLRはそのスレッドで実行されているファイナライザのキュー全体を終了させます。 – reuben

+2

@Reuben、質問を読んでください。答えは100%正確ですが、COMに関する大きな本質的な詳細はこの質問とは関係ありません。 –

関連する問題