Я делю приложение на подклассы. Моя подклассовая процедура Window находится в DLL. Мой код подклассов внутри DLL выглядит примерно так (урезан, удалены другие несвязанные части).
class FooBar
{
private delegate int WndProcDelegateType(IntPtr hWnd, int uMsg,
int wParam, int lParam);
private const int GWL_WNDPROC = (-4);
private static IntPtr oldWndProc = IntPtr.Zero;
private static WndProcDelegateType newWndProc = new
WndProcDelegateType(MyWndProc);
internal static bool bHooked = false;
[DllImport("user32.dll")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex,
WndProcDelegateType dwNewLong);
[DllImport("user32.dll")]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex,
IntPtr dwNewLong);
[DllImport("user32")]
private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd,
int Msg, int wParam, int lParam);
private static int MyWndProc(IntPtr lhWnd, int Msg, int wParam, int lParam)
{
switch (Msg)
{
// the usual stuff
// finally
return CallWindowProc(oldWndProc, lhWnd, Msg, wParam, lParam);
}
internal static void Hook()
{
oldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, newWndProc);
bHooked = oldWndProc != IntPtr.Zero;
}
internal static void Unhook()
{
if (bHooked) SetWindowLong(hWnd, GWL_WNDPROC, oldWndProc);
}
}
Теперь, несмотря на то, что я держу сильную ссылку на WndProc в статической переменной экземпляра делегата на уровне класса, я получаю эту ошибку.
Обнаружен CallbackOnCollectedDelegate
Сообщение: обратный вызов был сделан на
сборщик мусора делегат типа
'PowerPointAddIn1! FooBar + WndProcDelegateType :: Invoke.
Это может вызвать сбой приложения,
коррупция и потеря данных. При прохождении
делегаты в неуправляемый код, они должны быть сохранены
живой управляемым приложением до
гарантируется, что они никогда не будут
быть вызванным.
Что я делаю не так?