代表有两个相关属性,方法和目标.如果为实例方法创建了委托,则Target将为非null.只要垃圾收集器可以看到委托实例,这就可以使对象保持活动状态.
本机代码与回调问题相关.当您将委托实例传递给pinvoked本机函数时,P/Invoke编组器将使用Marshal.GetFunctionPointerForDelegate()创建一个小存根,在本机代码进行回调时生成所需的Target引用.然而,垃圾收集器无法看到此存根,因此无法找到对委托对象的引用.并收集它.来自本机代码的下一个回调会导致崩溃.
为避免这种情况,您必须自己存储委托对象,以便只要本机代码可以进行回调,它就会保持引用状态.将其存储在静态变量中是一个明显的解决方案.