2010-09-21 79 views
6

我需要在我的C#.NET 2.0應用程序中將UIntPtr對象轉換爲IntPtr的對象。這如何實現?我不認爲它是如此簡單:如何在C#中將UIntPtr對象轉換爲IntPtr?

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

回答

15

這應該在x86和x64

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

不幸的是,這似乎不適用於x86。我得到一個OverflowException: 'UIntPtr uintPtr = new UIntPtr(0xffffffffu); ((IntPtr)(long)(ulong)uintPtr);' – 2016-08-25 12:43:19

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

'UIntPtr X2 =新UIntPtr(x.ToPointer())工作;'的工作,但僅在不安全的上下文。 – Brian 2010-09-21 16:48:02

2

這應該在32位操作系統上運行:

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

也就是說,轉UIntPtr成UINT,把它轉換成一個int,然後把它變成一個IntPtr。

好處是抖動會優化所有轉換,並簡單地將其轉換爲一個值的直接賦值給另一個值,但我沒有真正測試過。

請參閱Jared的解答,瞭解適用於64位操作系統的解決方案。

+0

如果'UIntPtr.Size!= 4',這也可以嗎? – dtb 2010-09-21 16:22:44

+10

這是* not *好吧,它會以64位模式破壞指針。使用long/ulong。 – 2010-09-21 16:23:45

+1

非常好,謝謝! – 2010-09-21 16:54:56