#c# #.net
#c# #.net
Вопрос:
В моей программе в этой строке:
int value = MTEConnect(auth_string, err);
Я получаю такое исключение:
FatalExecutionEngineError
The runtime has encountered a fatal error. The address of the
error was at 0x68c8a681, on thread 0x2334. 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.
MTEConnect импортируется таким образом:
[DllImport("mtesrl.dll", CharSet = CharSet.Ansi)]
private static extern int MTEConnect(String pars, StringBuilder err);
В чем проблема и как ее исправить?
upd: я могу воспроизвести ту же проблему на другом компьютере, но я получил немного более подробное сообщение:
Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:blahblahMBClientbinDebugMBClient.vshost.exe
Сама библиотека функциональна, потому что ее можно использовать из других приложений, я просто не могу использовать ее из c#
Ответ №1:
Я решил свою проблему! Код не работает таким образом:
StringBuilder err = new StringBuilder();
int value = MTEConnect(auth_string, err);
Но это действительно работает таким образом:
StringBuilder err = new StringBuilder(100);
int value = MTEConnect(auth_string, err);
Кажется, буфер был слишком коротким.
Комментарии:
1. я тоже 🙂 потратил неделю на решение этой головоломки 🙂
2. 1 Спасло мне день, когда я использовал StringBuilder для GetDefaultPrinter библиотеки спулера Win32 DLL (winspool.drv)
Ответ №2:
FatalExecutionEnigneError
Часто является результатом повреждения в основном машинном коде CLR, что приводит к фатальному исходному исключению. Когда это происходит на месте PInvoke
вызова, это важный показатель того, что PInvoke
подпись неверна.
Не могли бы вы предоставить собственную подпись, чтобы мы могли помочь диагностировать эту проблему?
Комментарии:
1. Я не знаю, что такое собственная подпись, где я могу ее получить? возможно, я могу просто поделиться dll, которую я использую, если это поможет?
2. если это важно, то у меня есть 2 версии одной и той же dll. они должны быть «совместимы», т. Е. должна быть возможность замены одного на другой. Однако, когда мой код работает с одной dll, он не работает с другой (без каких-либо изменений в коде)
3. Я поместил dll, которая здесь не работает zalil.ru/31055951 (также я могу отправить вам по электронной почте, если вы предпочитаете 🙂
4. @javapowered у вас есть файл заголовка, в котором определена функция MTEConnect?
5. У меня сейчас нет файла .h этой определенной библиотеки, но я почти уверен, что эта функция должна быть объявлена следующим образом «int32 WINAPI MTEConnect(char * Params, char * ErrorMsg);». Я попрошу разработчика библиотеки предоставить файл *.h завтра… Возможно, каким-то образом можно извлечь информацию, которую вы запрашиваете из * dll-файла?…