我需要在我的C#.NET 2.0应用程序中将UIntPtr
对象转换为IntPtr
的对象。这如何实现?我不认为它是如此简单:如何在C#中将UIntPtr对象转换为IntPtr?
UIntPtr _myUIntPtr = /* Some initializer value. */
object _myObject = (object)_myUIntPtr;
IntPtr _myIntPtr = (IntPtr)_myObject;
我需要在我的C#.NET 2.0应用程序中将UIntPtr
对象转换为IntPtr
的对象。这如何实现?我不认为它是如此简单:如何在C#中将UIntPtr对象转换为IntPtr?
UIntPtr _myUIntPtr = /* Some initializer value. */
object _myObject = (object)_myUIntPtr;
IntPtr _myIntPtr = (IntPtr)_myObject;
这应该在x86和x64
IntPtr intPtr = unchecked((IntPtr)(long)(ulong)uintPtr);
UIntPtr _myUIntPtr = /* Some initializer value. */ void* ptr = _myUIntPtr.ToPointer(); IntPtr _myIntPtr = new IntPtr(ptr);
'UIntPtr X2 =新UIntPtr(x.ToPointer())工作;'的工作,但仅在不安全的上下文。 – Brian 2010-09-21 16:48:02
这应该在32位操作系统上运行:
IntPtr intPtr = (IntPtr)(int)(uint)uintPtr;
也就是说,转UIntPtr成UINT,把它转换成一个int,然后把它变成一个IntPtr。
好处是抖动会优化所有转换,并简单地将其转换为一个值的直接赋值给另一个值,但我没有真正测试过。
请参阅Jared的解答,了解适用于64位操作系统的解决方案。
如果'UIntPtr.Size!= 4',这也可以吗? – dtb 2010-09-21 16:22:44
这是* not *好吧,它会以64位模式破坏指针。使用long/ulong。 – 2010-09-21 16:23:45
非常好,谢谢! – 2010-09-21 16:54:56
不幸的是,这似乎不适用于x86。我得到一个OverflowException: 'UIntPtr uintPtr = new UIntPtr(0xffffffffu); ((IntPtr)(long)(ulong)uintPtr);' – 2016-08-25 12:43:19