Может ли "AddInProcess.exe перестал работать" быть подавленным?

Я пытаюсь изолировать потенциально вредоносный код, выполняя его в плагине MAF, запущенном в его собственном процессе:

    var x = token.Activate<Ix>(new AddInProcess(), AddInSecurityLevel.Internet);

Кажется, это работает хорошо, за исключением того, что при обработке StackruException отображается диалоговое окно: "AddInProcess.exe перестал работать". Это очень сложно проверить

    [TestMethod]
    public void TestStackru() {
        var host = new Host(Environment.CurrentDirectory
            + "/../../../build/pipeline");
        host.Run("foo");
        host.Tick();
        Thread.Sleep(1000);
        host.Monitors.Count.Should().Be(0);
        host.Shutdown();
    }

Если я нажму кнопку "закрыть" до истечения срока сна, тест пройдёт успешно, в противном случае он не пройдёт. Это означает, что процесс не завершается, пока не будет нажата кнопка "Закрыть". Учитывая, что я ожидаю завершения процесса, как я могу убедиться, что это происходит без вызова этого диалога? Я попытался установить в моей ОС "никогда не проверять решения", но диалог все равно появляется. Установка "автоматической проверки решений" исключает диалог, но занимает до десяти секунд, что нежелательно... и я бы предпочел избегать настройки ОС.

Перестал работать AddInProcess.exe

1 ответ

Решение

Вы можете вызвать SetErrorMode где-нибудь внутри процесса надстройки следующим образом:

    [Flags]
    enum ErrorModes : uint {
        SYSTEM_DEFAULT = 0x0,
        SEM_FAILCRITICALERRORS = 0x0001,
        SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
        SEM_NOGPFAULTERRORBOX = 0x0002,
        SEM_NOOPENFILEERRORBOX = 0x8000
    }

    [DllImport( "kernel32.dll" )]
    static extern ErrorModes SetErrorMode( ErrorModes uMode );

    var em = SetErrorMode( 0 );
    SetErrorMode( em | ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOOPENFILEERRORBOX );
Другие вопросы по тегам