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

しかし、メモリ例外を発生させるポインターとしての int 値ではなく、data.signal (UInt32) 型へのポインターが必要なため、機能しません。

私が必要とするもののC++の例:

int signal = 0;
int* psignal = &signal;
4

2 に答える 2

4
new IntPtr(data.signal);

data.signal はアドレスの下位 32 ビットにしか依存しないため、64 ビット プラットフォームでは問題が発生します。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 を使用してオブジェクトを固定します

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 に答える