У меня есть ситуация, когда я вхожу в неуправляемый код и выхожу из него, и я думаю, что моя методология заставляет меня получить «FatalExecutionEngineError».В частности, у меня есть обратный вызов C # («X»), который возвращает другой обратный вызов («Y») в C #, где X и Y вызываются неуправляемым кодом C ++ (который вызывается C #).Ошибка выдается при возврате из обратного вызова Y.
Операторы импорта Dll:
[DllImport ("SearchDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern unsafe bool Dll_Search_Text (..., delegate_add_result Fn);
Неуправляемый код C:
extern "C" {
__declspec(dllexport) bool Dll_Search_Text (..., bool (*Add_Result (int, int)) (int, int, int)) {
bool (*Add_Result_Word) (int, int, int);
bool Add_Word_Ret;
...
Add_Result_Word = Add_Result ([int param], [int param]);
if (0 == Add_Result_Word) return false;
...
for (Itr=Set->begin (); Itr != Set->end (); Itr++) {
...
Add_Word_Ret = Add_Result_Word ([int param], [int param], [int param]);
}
}
return true;
}
}
Определения делегата:
public delegate bool delegate_add_result_word (int A, int B, int C);
public delegate delegate_add_result_word delegate_add_result (int D, int E);
Сообщение об ошибке:
"Managed Debugging Assistant 'FatalExecutionEngineError' has detected a
problem in 'C:\Neuric\bin\Search.exe'. Additional Information: The
runtime has encountered a fatal error. The address of the error was
at 0x6ea2ceca, on thread 0x744. 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."
Код работает некоторое время (и работал отлично, прежде чем я добавил вложенныйобратные вызовы), но выдает это исключение в остальное время.