#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. Да, хорошая мысль. Я пропустил это. Однако это не решило мою проблему.