2010-09-21 13 views

Respuesta

15

Esto debería funcionar en sistemas x86 y x64

IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr); 
+0

Desafortunadamente esto no parece funcionar en x86. Obtengo una OverflowException con: 'UIntPtr uintPtr = new UIntPtr (0xffffffffu); IntPtr intPtr = desmarcado ((IntPtr) (largo) (ulong) uintPtr); ' –

0
 
UIntPtr _myUIntPtr = /* Some initializer value. */ 
void* ptr = _myUIntPtr.ToPointer(); 
IntPtr _myIntPtr = new IntPtr(ptr); 
+1

'UIntPtr x2 = new UIntPtr (x.ToPointer());' funciona, pero sólo en un contexto inseguro. – Brian

2

Esto debería funcionar en sistemas operativos de 32 bits:

IntPtr intPtr = (IntPtr)(int)(uint)uintPtr; 

Es decir, gire el UIntPtr en un uint, convertir eso en un int, y luego convertirlo en un IntPtr.

Las probabilidades son buenas de que el jitter optimice todas las conversiones y simplemente lo convierta en una asignación directa de un valor al otro, pero en realidad no lo he probado.

Consulte la respuesta de Jared para obtener una solución que funcione en sistemas operativos de 64 bits.

+0

¿Esto también funciona si 'UIntPtr.Size! = 4'? – dtb

+10

Esto * no * está bien, destruye el puntero en el modo de 64 bits. Usa long/ulong. –

+1

¡Excelente punto, gracias! –

Cuestiones relacionadas