Поддерживает ли DangerousAddRef весь SafeHandle или только дескриптор?

Я нахожусь в ситуации, когда у меня есть объект aC#, содержащий HGLOBAL и List . HGLOBAL содержит ссылки на делегатов, а HGLOBAL регистрируется в неуправляемом коде как обратный вызов (в частности, интерфейс в стиле vtbl).

Я пытаюсь не увязнуть в деталях общего дизайна (я уже ожидаю криков от тех, кто понимает, что я делаю в предыдущем абзаце). Мой вопрос в настоящее время касается управления жизненным циклом с использованием функций, которые я бы хотел задокументировать по-другому.

Я преобразовал класс, содержащий HGLOBAL и List , в подкласс SafeHandle (из-за CriticalFinalizerObject и потому что HGLOBAL является своего рода дескриптором), и у меня есть класс, который создает это с помощью атомарных транзакций в стиле CER для информирования C#, когда неуправляемый код перестает ожидать, что он останется.

Эффективно ли вызов DangerousAddRef увеличивает счетчик ссылок для всего объекта SafeHandle? Будет ли список <Делегат> включен в этот счетчик ссылок? Другой способ задать вопрос - эффективно ли DangerousAddRef создает GCHandle для всего объекта SafeHandle или он делает это просто для члена SafeHandle.handle внутри?

Если он не применяется к объекту в целом, то List , вероятно, будет собран на ранней стадии и приведет к нарушениям доступа, когда неуправляемый код попытается вызвать его.

Если это относится к объекту в целом, то я только что создал блок объектов с подсчетом ссылок в куче, собранной мусором, и мне лучше быть уверенным, что я не создал никаких циклов ссылок.

Я подозреваю, что это последнее, но очень мало поисковых запросов в Google по этому виду, и когда единственными симптомами, с которыми вы сталкиваетесь, являются нарушения неуправляемого доступа из потока финализатора при завершении процесса, когда не запускается ни один фактический управляемый код, тогда он запускается трудно понять, идете ли вы в правильном направлении.

0 ответов

Другие вопросы по тегам