Когда GCHandles создаются для управляемых объектов, передаваемых в неуправляемый код? - PullRequest
0 голосов
/ 06 июля 2018

Это вопрос, который у меня возник, когда я прочитал ответ на этот вопрос 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)?

...