这是我阅读this StackOverflow question的答案时遇到的一个问题。何时将为托管对象创建的GCHandles确切地传递给非托管代码,以及何时释放这些句柄?
一个创建GCHandle的示例-在上面的链接中已提及,但我也用内存分析工具进行了验证-该示例位于以下System.Threading.Timer构造函数的重载所调用的方法之一内: / p>
public Timer(TimerCallback callback, object state, int dueTime, int period)
方法调用的途径之一是从上到下阅读:
System.Threading.Timers.TimerSetup
System.Threading.TimerBase.AddTimer
System.Threading.TimerBase.AddTimerNative
我从内存探查器中可以看到System.Threading.TimerBase.AddTimer方法创建了GCHandles,但是在该方法中我没有看到对GCHandle.Alloc的显式调用。 GCHandle在哪里创建?当调用导致非托管代码的方法(在这种情况下为System.Threading.TimerBase.AddTimerNative)时,.NET是否只是一种自动发生的事情?