CallbackOnCollectedDelegate a été détecté

Je suis sous-classement d'une application. Mon sous-classé procédure de Fenêtre est dans une DLL. Mon code de sous-classement à l'intérieur de la DLL ressemble un peu à ce (démonté, enlevé d'autres non-parties liées).

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);
  }
}

Maintenant, même si je suis titulaire d'une référence forte à la WndProc dans une classe de niveau statique de la variable d'instance du délégué, j'ai cette erreur.

CallbackOnCollectedDelegate a été détecté

Message: Un rappel a été fait sur un
les ordures collectées délégué de type
'PowerPointAddIn1!FooBar+WndProcDelegateType::Invoke'.
Cela peut provoquer des crashs de l'application,
la corruption et la perte de données. Lors du passage de
les délégués à du code non managé, ils doivent être conservés
vivant par l'application gérée jusqu'
c'est la garantie qu'ils ne seront jamais
être appelé.

Ce que je fais mal?

OriginalL'auteur Water Cooler v2 | 2011-01-31