-3

我有以下问题:

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;
4

2 回答 2

4
new IntPtr(data.signal);

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

如果您尝试获取 data.signal 的地址:

new IntPtr(&data.signal);

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

1) 更改 PInvoke 签名:

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

2) 使用固定固定对象

fixed (void* s = &data.signal)
{
    if (WSAWaitForMultipleEvents((UInt32)1, s, (UInt32)0, (UInt32)100, false) != WSA_WAIT_TIMEOUT)
    {
    }
}
于 2012-11-19T22:55:10.567 回答
1

这也编译

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

所以也许这就是你想要的

IntPtr signal = new IntPtr(data.signal);
于 2012-11-19T22:48:19.430 回答