Нужно ли использовать конструктор IntPtr, чтобы установить IntPtr равным другому IntPtr? - PullRequest
0 голосов
/ 11 апреля 2019

В настоящее время я выполняю рефакторинг приложения в 64-разрядную версию и пытаюсь понять конкретное использование IntPtr. Код, который я пытаюсь понять, имеет вид:

IntPtr a = Marshal.AllocHGlobal(SomeObjectSize); //SomeObjectSize is calculated based on some standard
IntPtr b = IntPtr(a.ToInt32());

Теперь, на первый взгляд, я подумал, что могу просто изменить a.ToInt32() на a.ToInt64(), что сработало для случаев, когда int необходимо для перехода в IntPtr, но, поскольку a и b оба IntPtr типов, я не могу просто использовать IntPtr b = a;, поскольку IntPtr является типом значения? Я полагаю, что это избавит меня от необходимости проверять наличие 64-битных или 32-битных сборок в подобной ситуации, и документы MSDN, похоже, не предполагают никакой магии в конструкторе IntPtr.

В основном мой вопрос: зачем мне использовать

IntPtr a = Marshal.AllocHGlobal(SomeObjectSize);
IntPtr b = IntPtr(a.ToInt32());

над

IntPtr a = Marshal.AllocHGlobal(SomeObjectSize);
IntPtr b = a;

1 Ответ

0 голосов
/ 11 апреля 2019

Вы можете не только использовать

IntPtr b = a;

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

Однако IntPtr является многоцелевым типом и предназначен не только для хранения информации об указателях, но и для различных дескрипторов Windows API для использования в операциях взаимодействия Win API (однако в основном это используется средой выполнения и CTSи редко по внешним приложениям).Многие из этих дескрипторов (например, дескрипторы окон, дескрипторы значков, дескрипторы файлов, дескрипторы реестра и т. Д.) Имеют 32-разрядный размер, и именно здесь IntPtr должен быть инициализирован с целым числом определенного размера, а также к конструктору IntPtr(int value)в игру.

...