Это вопрос, который у меня возник, когда я прочитал ответ на этот вопрос StackOverflow . Когда именно GCHandles создаются для управляемых объектов, передаваемых в неуправляемый код, и когда эти дескрипторы освобождаются?
Пример, где создается GCHandle - на который ссылается приведенная выше ссылка, но который также проверяется с помощью инструмента профилирования памяти на моем конце - находится в одном из методов, вызываемых следующей перегрузкой конструктора System.Threading.Timer:
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? Это просто автоматическая вещь, которая происходит в .NET, когда вызывается метод, приводящий к неуправляемому коду (в данном случае System.Threading.TimerBase.AddTimerNative)?