UInt32 to IntPtr

  • 本文关键字:IntPtr to UInt32 c#
  • 更新时间 :
  • 英文 :


我有以下问题:

public class ListenThread : SocketInvoke
{
[DllImport("Ws2_32", CharSet = CharSet.Auto)]
public unsafe static extern UInt32 WSAWaitForMultipleEvents(UInt32 cEvents, IntPtr hEventObject,
UInt32 fWaitAll, UInt32 dwTimeout, Boolean fAlertable);
public void ListenConnections(NetSharedData data)
{
while (true)
{
unsafe
{
if (WSAWaitForMultipleEvents((UInt32)1, data.signal, (UInt32)0, (UInt32)100, false) != WSA_WAIT_TIMEOUT)
{
}
}
}
}

data.signal是一个UInt32,我如何将其转换为IntPtr?,我试试:

IntPtr signal = (IntPtr)data.signal;

但它不起作用,因为我需要一个指向data.signal(UInt32)类型的指针,而不是作为指针的int值,这将导致内存异常。

我需要的一个C++示例:

int signal = 0;
int* psignal = &signal;
new IntPtr(data.signal);

在64位平台上会遇到问题,因为data.signal只挂在地址的低32位上。如果NetSharedData是您的,您应该考虑将信号类型更改为IntPtr。

如果您正在尝试获取数据的地址。信号:

new IntPtr(&data.signal);

我不确定这是否能正确地固定对象(以防止内存管理器重新定位它),我会做以下操作:

1) 更改PInvoke签名:

public unsafe static extern UInt32 WSAWaitForMultipleEvents(UInt32 cEvents, 
void* hEventObject, UInt32 fWaitAll, UInt32 dwTimeout, Boolean fAlertable);

2) 使用fixed固定对象

fixed (void* s = &data.signal)
{
if (WSAWaitForMultipleEvents((UInt32)1, s, (UInt32)0, (UInt32)100, false) != WSA_WAIT_TIMEOUT)
{
}
}

这也编译

UInt32 unsignedInt = 6;
IntPtr iptr = new IntPtr(unsignedInt);

所以也许这就是你想要的

IntPtr signal = new IntPtr(data.signal);

最新更新