GetComInterfaceForObject закрепляет объект?

2

Будет ли использовать GetComInterfaceForObject и передавать возвращенный IntPtr в неуправляемый код, чтобы перемещаемый управляемый объект перемещался в памяти? Или clr каким-то образом поддерживает этот ptr? Обратите внимание, что неуправляемый код будет использовать это для времени жизни программы, и мне нужно убедиться, что управляемый объект не перемещается GC (по крайней мере, я думаю, что правильно?)

  • EDIT - Хорошо, я нашел некоторую информацию, и я думаю, что это может быть ответ. Он имеет дело с делегатами, но я должен был бы верить, что вызов GetComInterfaceForObject делает что-то в тех же строках.

Источник следующего текста

"Управляемые делегаты могут быть привязаны к неуправляемому коду, где они отображаются как неуправляемые указатели функций. Звонит тем указатели будут выполнять неуправляемый управляемый переход; изменение вызывающая конвенция; вход в правильный AppDomain; и любые необходимые аргументация маршалинга. Очевидно, что неуправляемый указатель функции должен ссылаться на фиксированный адрес. Было бы катастрофой, если бы GC переместили это! Эта приводит множество приложений для создания дескриптора для делегата. Эта совершенно не нужно. Указатель неуправляемой функции фактически ссылается к нативной заглушке кода, которую мы динамически генерируем для выполнения перехода & Амп; сортировочный. Этот заглушка существует в фиксированной памяти вне кучи GC.

Тем не менее, приложение несет ответственность за как-то продление срока службы делегата до тех пор, пока от неуправляемого кода не будет больше вызовов. время жизни заглушки нативного кода напрямую связано со временем жизни делегировать. После того, как делегат будет собран, последующие вызовы через неуправляемый указатель функции приведет к сбою или иным образом повреждению процесса. В наш недавний выпуск, мы добавили пробник отладки клиента, который позволяет вам чистите это слишком частой ошибкой в ​​коде. Если у вас нет начали использовать клиентские отладочные зонды во время разработки, пожалуйста, посмотрите! "

Теги:
interop

1 ответ

1
Лучший ответ

Поскольку ваши состояния редактирования (о делегатах), ваш управляемый объект не нужно закреплять, так как GetComInterfaceForObject возвращает "закрепленный" указатель, который обращается к правильному управляемому объекту. Однако вам нужно будет убедиться, что управляемый объект живет до тех пор, пока COM-клиенты используют неуправляемый указатель на него.

  • 0
    Потрясающие! Вот что я понял после прочтения этого. Спасибо за ответ, пытаюсь отследить AccessViolationExceptions.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню