私は、以前のSOの質問で言及された、実際には、C++で記述されたDllSurrogate COM-Server、ATLを持っています。を使用して、多くのクライアントと C# アプリケーションから COM-Server からシングルトンを作成および/または接続していますCoCreateInstance
。COMオブジェクトの使用が終了した後、両方でそれぞれのリリースが呼び出されます。Delphi では、インターフェイスが範囲外になると、インターフェイスの Release Reference Count に基づいていますMarshal.ReleaseComObject
。
問題は、クライアント アプリケーションが予期せず閉じられた場合 (プロセスから強制終了された場合やクラッシュした場合) です。この場合、COM オブジェクトはメモリに残り、DLLHOST.exe にロードされます。
このようなリークを回避する標準的な方法はありますか? または、COM-Server自体の書き方に問題がある可能性があります(ソースナットがあり、それらは私の責任ではなく、ATLを知りません)
EDITED: COMには、6〜8分後に残っている孤立したCOMオブジェクトをクリアする独自のガベージコレクションメカニズムがあることを発見しました(@Simon Mourierに感謝します)。残りの孤立した COM オブジェクトを処理するアプリケーション ロジックの問題は、再初期化などです。