5

これは、 c# で Excel 相互運用オブジェクトを適切にクリーンアップする方法 への質問の続き です。

要点は、Excel 名前空間内で連鎖呼び出し (例: ExcelObject.Foo.Bar() ) を一緒に使用すると、COM オブジェクトのガベージ コレクションが防止されることです。代わりに、使用する各 COM オブジェクトへの参照を明示的に作成し、Marhsal.ReleaseComObject() を使用してそれらを明示的に解放する必要があります。

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

4

2 に答える 2

6

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

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

通常のインプロセス COM ライブラリの場合、適切にクリーンアップできなかった場合の結果はそれほど劇的ではありません。プロセスが終了すると、すべてのインプロセス ライブラリがプロセスと共になくなります。また、オブジェクトが不要になったときに ReleaseComObject を呼び出すのを忘れた場合でも、最終的にオブジェクトがファイナライズされるときに処理されます。

とはいえ、これはずさんなコードを書く言い訳にはなりません。

于 2009-09-03T12:58:24.010 に答える
2

COMオブジェクトは基本的にアンマネージコードです。マネージアプリケーションからアンマネージコードの呼び出しを開始するとすぐに、そのアンマネージコードの後でクリーンアップする責任があります。

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

于 2009-09-03T09:15:21.560 に答える