Есть ли способ справиться, когда COM-объект отключен от RCW? - PullRequest
0 голосов
/ 16 февраля 2012

Есть ли способ запустить код, когда COM-объект собирается отключиться от RCW без реализации интерфейса IDisposale и явного вызова MyObject.Dispose в клиентском коде?

Код ниже не работает. Когда программа входит в Finalize sub, приложение ExcelApplication уже отключено от RCW, и я получаю сообщение об ошибке. Я понимаю, почему это происходит, но я хочу найти решение.

Я хочу, чтобы он работал следующим образом: при выпуске последней управляемой ссылки код из подпрограммы Finalize выполняется до отключения COM-объекта.

У меня вопрос: возможно ли это вообще, и если да, то как я могу обработать это событие внутри класса, без необходимости явного вызова 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

Этот класс используется в форме - всего одна строка

Dim ExcelRunner as ExcelRunner = новый ExcelRunner

Затем я закрываю форму и получаю сообщение об ошибке.

Спасибо

1 Ответ

0 голосов
/ 16 февраля 2012

Похоже, вы хотите получить уведомление об отключении RCW непосредственно перед тем, как это произойдет.Если так, то, к сожалению, такого способа не существует.Вместо этого ваш код должен учитывать вероятность неожиданного отключения

...