Может ли "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();
}
Если я нажму кнопку "закрыть" до истечения срока сна, тест пройдёт успешно, в противном случае он не пройдёт. Это означает, что процесс не завершается, пока не будет нажата кнопка "Закрыть". Учитывая, что я ожидаю завершения процесса, как я могу убедиться, что это происходит без вызова этого диалога? Я попытался установить в моей ОС "никогда не проверять решения", но диалог все равно появляется. Установка "автоматической проверки решений" исключает диалог, но занимает до десяти секунд, что нежелательно... и я бы предпочел избегать настройки ОС.
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 );