2010-09-21 14 views
6

Ho bisogno di convertire un oggetto UIntPtr in quello di IntPtr nella mia applicazione C# .NET 2.0. Come può essere realizzato? Non credo che sia semplice come questo:Come può un oggetto UIntPtr essere convertito in IntPtr in C#?

UIntPtr _myUIntPtr = /* Some initializer value. */ 
object _myObject = (object)_myUIntPtr; 
IntPtr _myIntPtr = (IntPtr)_myObject; 

risposta

15

Questo dovrebbe funzionare su x86 e x64

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

Sfortunatamente non sembra funzionare su x86. Ricevo una OverflowException con: 'UIntPtr uintPtr = new UIntPtr (0xffffffffu); IntPtr intPtr = deselezionato ((IntPtr) (long) (ulong) uintPtr); ' –

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

'UIntPtr x2 = new UIntPtr (x.ToPointer());' funziona, ma solo in un contesto non sicuro. – Brian

2

Questo dovrebbe funzionare su sistemi operativi a 32 bit:

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

Cioè, girare l'UIntPtr in un uint, trasformarla in un int, e quindi trasformarlo in un IntPtr.

Le probabilità sono buone che il jitter ottimizzerà tutte le conversioni e trasformerà semplicemente questo in un assegnamento diretto di un valore all'altro, ma in realtà non l'ho provato.

Vedere la risposta di Jared per una soluzione che funziona su sistemi operativi a 64 bit.

+0

Funziona anche se 'UIntPtr.Size! = 4'? – dtb

+10

Questo * non * va bene, distrugge il puntatore in modalità 64 bit. Utilizzare a lungo/a lungo. –

+1

Punto eccellente, grazie! –

Problemi correlati