Создание подкласса окна MS Word из надстройки VSTO

#c# #crash #ms-word #vsto #subclassing

#c# #сбой #ms-word #vsto #создание подкласса

Вопрос:

Я пытаюсь обнаружить некоторые события, которые VSTO не предоставляет, такие как WM_MOVE, WM_SIZE и т. Д., Чтобы Отрегулировать положение окна. Это окно создается надстройкой, над которой я работаю, и должно реагировать при изменении окна Word. В основном мне удалось выполнить свою задачу, но остается очень досадная проблема. Всякий раз, когда я закрываю Word, появляется обработчик сбоя. Очевидно, это как-то связано с неправильным удалением объекта на основе NativeWindow, который я использую. Я разместил кнопку на ленте, чтобы иметь возможность вручную удалять объект, и все работало отлично. Я подозреваю, что сборщик мусора по какой-то причине не выполняет свою работу должным образом. Кроме того, даже вызов ReleaseHandle() для WM_CLOSE или WM_DESTROY не предотвращает сбой. Вот код моего объекта-перехватчика:

 public class OfficeWindow : NativeWindow, IDisposable
{        
    public OfficeWindow(IntPtr handle)
    {
        this.AssignHandle(handle);            
    }

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        { 
            case (int)WindowMessages.WM_MOVE:
                MessageBox.Show("Move");
                break;
            //other cases
        }

        base.WndProc(ref m);
    }

    #region IDisposable Members

    ~OfficeWindow()
    {
        Dispose(false);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // Free other state (managed objects).
        }
        ReleaseHandle();
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    #endregion
}
  

Я использую VS 2008, VSTO 3.0, а надстройка нацелена на Word 2007.

Комментарии:

1. Убедитесь, что удаление происходит только один раз. Я вижу, что ваш деструктор освободит дескриптор, затем он попытается сделать это снова, когда вы действительно сделаете dispose ( true ).

2. Да, хорошая мысль. Я пропустил это. Однако это не решило мою проблему.