Может ли "AddInProcess.exe перестал работать" быть подавленным? - PullRequest
1 голос
/ 18 сентября 2011

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

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

Похоже, это работает хорошо, за исключением того, что при обработке исключения StackOverflowException отображается диалоговое окно: «AddInProcess.exe перестал работать». Это очень затрудняет тестирование

    [TestMethod]
    public void TestStackOverflow() {
        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 has stopped working

1 Ответ

4 голосов
/ 21 сентября 2011

Вы можете вызвать 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 );
...