皆さん-私は.netで多くのCOMサーバーを作成しています(私は多数のEXEを起動しています)、COM相互運用を介してCOMと通信している、サーバーで多数のCOMオブジェクトを使用しているなどです。プロセスを強制終了した場合、害はありますか?Marshal.FinalReleaseComObject()を介して使用したすべてのCOMオブジェクトを解放しないことについて何か悪いことはありますか?時間の経過とともにメモリリークが発生しますか?
1 に答える
インプロセスサーバーよりもはるかに一般的ではありませんが、アウトプロセスCOMサーバーについて話していると仮定します。クライアントアプリを強制終了するのは悪いことです。サーバーはリリース呼び出しを取得しません。クライアントが割り当てたオブジェクトのリソースは、EXEが終了するまで使用され続けます。サーバーアプリを強制終了すると、クライアントアプリはRPCエラーで失敗し、何もリークされません。
Marshal.FinalReleaseComObject()を使用しないことには何の問題もありません。COMオブジェクトの参照カウントは、RCW(ランタイム呼び出し可能ラッパー)によって管理されます。これは、.NETプログラミングの他のオブジェクトと同様に管理対象オブジェクトであり、ガベージコレクターが処理します。ファイナライザーが実行されると、参照カウントがデクリメントされます。それがいつ起こるかは予測できません。
Final / ReleaseComObject()を使用すると予測可能になりますが、作成するすべてのオブジェクトで呼び出す必要があります。これは難しいかもしれませんが、たとえばインデクサーを使用するときに作成したことが常に明らかであるとは限りません。また、呼び出しのタイミングを間違えたり、オブジェクトへのすべての参照を適切に追跡しなかったりすると、悪名高い「基になるRCWから分離されたCOMオブジェクトを使用できません」という例外が発生することも危険です。良い戦争物語はここにあります。