Можно ли поймать или скрыть окно неуправляемых исключений? - PullRequest
1 голос
/ 23 декабря 2019

Рассмотрим следующий собственный код (который нельзя изменить по причинам):

#include <cstdio>
#include <exception>

extern "C" {
    __declspec(dllexport) void terminate_me(void) {
        puts("hello from C");
        std::terminate();
        puts("bb from C");
    }
}

Который вызывается из C # (который мы можем изменить любым удобным для нас способом)

using System.Runtime.InteropServices;

class Program
{
    [DllImport("Project1.dll")]
    static extern void terminate_me();

    static void Main(string[] args)
    {
        terminate_me();
    }
}

Ивот что происходит:

enter image description here

Мои вопросы: можем ли мы аварийно завершить работу приложения, не показывая это окно пользователю? Я имею в виду, что с неуправляемым кодом случилось что-то плохое, просто закройте приложение с кодом ошибки, не показывайте пользователю ничего.

Возможно ли это?

1 Ответ

1 голос
/ 24 декабря 2019

Используйте функции _CrtSetReportMode , что-то вроде этого:

extern "C" {
    __declspec(dllexport) void terminate_me(void) {
        _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); // define that anywhere in your init code, etc.
        puts("hello from C");
        std::terminate();
        puts("bb from C");
    }
}

Обратите внимание, когда _DEBUG не определено (поэтому в выпуске), вызовы _CrtSetReportMode удаляются во времяпредварительная обработка.

Ваша ошибка BadImageFormatException, вероятно, связана с тем фактом, что вы установили флажок "Предпочитать 32-разрядный" в свойствах проекта .NET в режиме выпуска. Эта ошибка всегда проблема несоответствия x86-x64.

...