2012-02-15 41 views
0

IDisposaleインターフェイスと明示的にMyObject.Disposeをクライアントコードで実装せずにCOMオブジェクトがRCWから切断される直前にコードを実行する方法はありますか?COMオブジェクトがRCWから切断されたときに対処する方法はありますか?

以下のコードは機能しません。プログラムがFinalizeサブを入力すると、ExcelApplicationはすでにRCWから切断されており、エラーが発生します。なぜそれが起こるのか理解していますが、私は解決策を得たいと思います。

最後の管理参照が解放されると、COMオブジェクトが切断される前にFinalizeサブコードが実行されます。

私の質問は - まったく可能なのですが、どうすればこのイベントをクラス内で処理でき、外部から明示的にFinalizeを呼び出す必要はありませんか?

非常に単純なクラス:

Public Class ExcelRunner 

    Dim ExcelApplication As Excel.Application 

    Public Sub New() 

    ExcelApplication = New Excel.Application 
    ExcelApplication.Visible = True 

    End Sub 

    Protected Overrides Sub Finalize() 

    MyBase.Finalize() 
    ExcelApplication.Quit() 

    End Sub 

End Class 

このクラスは、フォーム上で使用されている - 1行だけExcelRunner =新しいExcelRunner

として

薄暗いExcelRunnerそれから私は、フォームを閉じると、エラーが表示されます。

おかげ

答えて

0

あなたはそれが起こる直前に切断されRCWについての通知を受信するように聞こえます。もしそうなら、残念ながらそのような方法はありません。あなたのコードは、予期せず接続が切断されている可能性を考慮する必要があります。

+0

はい、発生する直前に通知を受け取りたいと思います。 – xll

+0

@xll残念ながらそれは不可能です。 – JaredPar

関連する問題