Tôi đang phân lớp ứng dụng. Thủ tục Window subclassed của tôi nằm trong một DLL. Mã subclassing của tôi bên trong DLL trông hơi giống như thế này (tước xuống, loại bỏ các phần không liên quan khác).CallbackOnCollectedDelegate đã được phát hiện
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);
}
}
Bây giờ, mặc dù tôi đang nắm giữ tham chiếu mạnh mẽ đến WndProc trong biến thể hiện tĩnh cấp lớp của đại biểu, tôi nhận được lỗi này.
CallbackOnCollectedDelegate được phát hiện
nhắn: Một callback được thực hiện trên thu gom rác thải đại biểu của loại 'PowerPointAddIn1 Foobar + WndProcDelegateType :: Invoke!'. Điều này có thể gây ra sự cố ứng dụng, tham nhũng và mất dữ liệu. Khi vượt qua đại biểu để mã không được quản lý, họ phải được giữ còn sống bởi ứng dụng được quản lý cho đến khi đảm bảo rằng họ sẽ không bao giờ được gọi là .
Tôi đang làm gì sai?
Cảm ơn bạn đã giúp đỡ của bạn Câu trả lời của bạn là chính xác nhưng tôi vẫn nhận được ngoại lệ.Tôi rất tiếc rằng tôi đã đăng Tôi đã có những thay đổi trước khi đăng câu hỏi này.Tôi đã có mã ở hai nơi và đăng các mã trước đó, mà tôi đã không thay đổi.Tôi vẫn nhận được ngoại lệ –
Erm, những gì tôi phải xem xét? –
@Hans: Xin lỗi, tôi không hiểu bạn. Tôi có để lại một thứ gì đó không giải thích được không? –