0

フロント エンドで Excel を使用し、COM 経由でサード パーティの API を介してリモート データにアクセスするアプリを開発しています。アプリは Excel VBA で直接コーディングされています (つまり、Excel の COM オートメーションはありません)。アプリの実行後にユーザーが終了しても Excel が終了しないことがあり、CPU の 50% を消費するゾンビ Excel が作成されます。

SO で既存の「Excel が終了しない」の回答を読みました。それらはすべて、Excel の Interop/COM 自動化に関連しているようです。この場合、Excel を確実に終了させる方法について何か提案はありますか?

4

1 に答える 1

0

私のコードで作成された COM オブジェクトが適切に破棄されていないため、Excel が完全に終了できないと考えるようになりました。私は彼らの解放を強制しようとしましたが、この質問につながりました: Excel 2007 VBAモジュール内からSystem.Runtime.InteropServices.Marshal.ReleaseComObjectを呼び出すにはどうすればよいですか?

Excel を終了するときに、COM オブジェクトへの参照をすべて削除していますか? COM オブジェクトへの参照を保持するたびに、次のような行を配置してください。

obj = Nothing ' Where "obj" is a reference to the COM object

それでも解決しない場合は、問題が循環参照である可能性もあります。COM オブジェクトは、COM オブジェクトへの参照を保持する VBA オブジェクトへの参照を保存しますか? その場合、循環参照が作成され、オブジェクトは解放されません。

私は今、循環参照を疑っています。ワークブックのクローズ イベントでNothingオブジェクト自体を設定する前に、特定の COM オブジェクト プロパティを設定すると問題が解決した場合は、戻ってきて、これを受け入れられた回答としてマークします。Nothing

アップデート

オブジェクト参照を慎重に設定してNothingも、問題は解決しませんでした。最終的に、.NET 用のCOM 可視 dll ラッパーを System.Runtime.InteropServices.Marshal.FinalReleaseComObject作成しました。Workbook BeforeClose イベントで COM オブジェクトに対して dispose を呼び出すと、問題が解決したようです。

于 2012-11-27T16:32:56.920 に答える