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

Есть ли способ запустить код, когда 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 как ExcelRunner = новый ExcelRunner

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

Спасибо

1 ответ

Решение

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

Другие вопросы по тегам