2010-09-21 81 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