Мне не ясно, что вы подразумеваете под элементом управления ActiveX, который реализует метод Dispose. Шаблон IDisposable
предназначен для управляемого кода. Чтобы освободить COM-объект, вы обычно используете Marshal.ReleaseComObject
- возможно, вы делаете это внутри вашего AxControl
класса, реализацию которого вы не показываете.
Несколько вещей не так с приведенным выше кодом.
Вы должны удалить экземпляр IDisposable DoStuff
:
private void RunStuff()
{
using (DoStuff stuff = new DoStuff())
{
stuff.PerformStuff();
}
}
Вы не должны получать доступ к управляемым ресурсам в финализаторе - в вашем случае финализатор вызывает Dispose, который затем ссылается на управляемый экземпляр axControl. Возможно, этот экземпляр уже был собран к моменту запуска финализатора.
Поскольку вы не используете неуправляемые ресурсы непосредственно в классе DoStuff, вам, вероятно, не нужен финализатор, но если он у вас есть, следуйте стандартному шаблону IDisposable в MSDN и не пытайтесь избавиться от каких-либо управляемых объектов. .
UPDATE
Комментарий:
AxControl - это библиотека .NET Interop Wrapper DLL, сгенерированная Visual Studio.
В этом случае, что такое метод Dispose ()? Я не понимаю, почему вы бы реализовали такой метод в элементе управления ActiveX, который имеет детерминированную финализацию - обычно вы выполняете очистку после освобождения последней ссылки COM.
Ваш метод DoStuff.Dispose
может захотеть освободить COM-объект, например,
public void Dispose()
{
activexControl.Dispose();
Marshal.ReleaseComObject(activexControl);
}