Вопросы по IntPtr - PullRequest
       1

Вопросы по IntPtr

2 голосов
/ 13 октября 2010

Когда я делаю P / Invoke или COM InterOP, я часто сталкиваюсь с IntPtr. Итак, вот пара вопросов:

  • Все говорили, что IntPtr - это struct , так что в нем? Я могу думать только о 32-битном / 64-битном целом числе, это адрес, на который он указывает. Что-нибудь еще?

  • Где находится IntPtr? Если это структура, я считаю, что она должна быть в управляемом стеке CLR . Но что если я передам IntPtr неуправляемому методу при выполнении p / invoke, не передается ли он в неуправляемый стек ? Будет ли он скопирован в неуправляемый стек ? В адресном пространстве процесса есть управляемые и неуправляемые кучи, существует ли это разделение также для стека процесса

Ответы [ 3 ]

3 голосов
/ 13 октября 2010

IntPtr - это просто целое число, гарантированное равное размеру указателя. Из-за этого он часто используется для указания указателей в тех контекстах, где указатель считается «небезопасным».

Но, как указатель, это просто число. Если он содержит адрес, этот адрес может быть действительным или недействительным в этом процессе. Он может быть выровнен или не выровнен, это может быть место в стеке текущего потока или в стеке другого потока, или в управляемой куче, или в некоторой неуправляемой куче. Это просто число; является ли интерпретация этого числа в качестве указателя значимой или безопасной, зависит от вас, чтобы определить.

2 голосов
/ 13 октября 2010
1 голос
/ 13 октября 2010

Все говорили, что IntPtr - это структура, так что в ней?Я могу думать только о 32-битном / 64-битном целом числе, это адрес, на который он указывает.Что-нибудь еще?

Используя Reflector, вы можете видеть, что он содержит только одно поле экземпляра типа void*

private unsafe void* m_value;

Где находится IntPtr?Если это структура, я считаю, что она должна быть в управляемом стеке CLR.Но что, если я передаю IntPtr неуправляемому методу при выполнении p / invoke, не передается ли он неуправляемому стеку?Будет ли он скопирован в неуправляемый стек?В адресном пространстве процесса есть управляемые и неуправляемые кучи, существует ли эта разделенность и для стека процесса?

Во-первых, структуры не обязательно хранятся в стеке.Это распространенное заблуждение: они могут храниться в стеке, но это не значит, что это всегда так (подробности см. в этой статье ).

Кроме того, здесь нет «стека процессов»: каждый поток имеет свой собственный стек.

Я не знаю всех подробностей о том, как работает p / invoke, но в основном да, значение IntPtr копируется в неуправляемыйmemory.

Если вам нужна дополнительная информация о взаимодействии с неуправляемым кодом, вас может заинтересовать эта статья .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...