タイプのゴミ回収依頼がコールバックされました.これにより、アプリケーションがクラッシュしたり、破損したり、データが失われたりする可能性があります.非管理コードに委任を渡す場合、管理アプリケーションは、問題の解決策が再び呼び出されないと確信するまで、これらの委任をアクティブにしなければならない.


「XXX::Invoke」タイプの廃棄回収依頼についてコールバックしました.これにより、アプリケーションがクラッシュしたり、破損したり、データが失われたりする可能性があります.管理対象外のコードに依頼を渡す場合、管理対象アプリケーションはこれらの依頼を再度呼び出さないと確信するまでアクティブにする必要があります」という問題の解決方法ソース・プログラムの一部のコードは次のとおりです.
/// <summary>
///        
/// </summary>
/// <param name="idHook"></param>
/// <param name="lpfn"></param>
/// <param name="hInstance"></param>
/// <param name="threadId"></param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
/// <summary>
///        
/// </summary>
/// <param name="idHook"></param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
/// <summary>
///         
/// </summary>
/// <param name="idHook"></param>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);

//       
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);


//      
HookProc KeyboardHookDelegate;


/// <summary>
///     
/// </summary>
public void SetHook()
{
    KeyboardHookDelegate = new HookProc(KeyboardHookProc);
    Process cProcess = Process.GetCurrentProcess();
    ProcessModule cModule = cProcess.MainModule;
    var mh = GetModuleHandle(cModule.ModuleName);
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookDelegate, mh, 0);
}


public void UnHook()
{
    UnhookWindowsHookEx(hHook);
}


/// <summary>
///       
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
//...
//       
return CallNextHookEx(hHook, nCode, wParam, lParam);
}

検索してみると、
可能性の原因は定義の委託がごみの回収メカニズムに回収されたためで、これは問題のような報告を誤り、ネット上の多くの友达は、委託をメンバー変数と定義しているが、私のはメンバー変数なのか間違いなのか、代理を定義すると言っているが、私が使っているのは代理で、ある友达は静的に定義すると言っている.しかし、私のところではすべて役に立たないようで、私が分析したように、
やっと解決しました.以下のように修正します.
public void SetHook()
{
    KeyboardHookDelegate = new HookProc(KeyboardHookProc);
    IntPtr intPtr = Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookDelegate, intPtr, 0);
}

現在のプロセスを取得し、現在のプロセスのMainModuleを取得し、MainModuleのModuleNameを取得します.
最後に現在のプログラムセットを反射で取得し、プログラムがプログラムセットを閉じていない場合は常に存在し、解決します.
私の上記の理解は間違っているかもしれないが、理解が間違っているなら、斧正を望んでいる.