Вызов неуправляемого делегата с BeginInvoke - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть делегат в неуправляемую функцию в DLL (которую я загрузил с помощью GetProcAddress). Я могу позвонить этому делегату без проблем. Однако когда я вызываю делегатов с помощью BeginInvoke, я получаю следующее исключение:

Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in '...'.
Additional Information: The runtime has encountered a fatal error. The address of the 
error was at 0x63fd8687, on thread 0xb4c. The error code is 0xc0000005. This error may
be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common 
sources of this bug include user marshaling errors for COM-interop or PInvoke, which
may corrupt the stack.

Это код:

        private void OnConnectFinished(IAsyncResult a_oResult)
        {
            ConnectDelegate l_oDelegate = (ConnectDelegate)a_oResult.AsyncState;

            if (ConnectFinished != null)
            {
                ConnectFinished(l_oDelegate.EndInvoke(a_oResult));
            }
        }

        public bool Connect()
        {
            AsyncCallback l_oCallback = new AsyncCallback(OnConnectFinished);
            IAsyncResult l_oResult = DLLConnect.BeginInvoke(l_oCallback, DLLConnect);

                    //This Works!:
            //bool l_bResult = DLLConnect(m_oConnectFinishedDelegate);
            //return l_bResult;

            return true;
        }

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 27 ноября 2011

Передача делегата как userState (второй аргумент в BeginInvoke) выглядит подозрительно. Будет ли это работать, если вы передадите туда null? (Да, я знаю, что ваш обратный вызов не будет работать, но эту проблему можно решить другим способом. Давайте проверим, исчезла ли сообщенная ошибка.)

...