Sono sottoclasse di un'applicazione. La mia procedura Window sottoclasse si trova all'interno di una DLL. Il mio codice di sottoclassi all'interno della DLL sembra un po 'come questo (rimosso, rimosso altre parti non correlate).CallbackOnCollectedDelegate è stato rilevato
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);
}
}
Ora, anche se ho in mano un forte riferimento alla WndProc in una a livello di classe un'istanza statica variabile del delegato, ottengo questo errore.
CallbackOnCollectedDelegate è stato rilevato
Messaggio: Una callback è stato effettuato su un garbage delegato raccolta di tipo 'PowerPointAddIn1 FooBar + WndProcDelegateType :: Invoke!'. Ciò potrebbe causare arresti anomali dell'applicazione, corruzione e perdita di dati. Quando si passano i delegati a codice non gestito, devono essere mantenuti in memoria in attesa dall'applicazione gestita fino a , in modo che non vengano mai chiamati .
Cosa sto sbagliando?
Grazie per il tuo aiuto. La tua risposta è corretta ma ottengo comunque l'eccezione Sono terribilmente dispiaciuto di aver postato il codice errato. Avevo già apportato tale modifica prima di pubblicare questa domanda: avevo il codice in due punti e ho pubblicato il codice precedente, che non avevo modificato, ma ottengo comunque l'eccezione. –
Ehm, che cosa dovrei guardare? –
@Hans: Scusa, non ti ho preso. Ho lasciato qualcosa di inspiegabile? –