2

独自のプロセスで起動された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();
    }

スリープが切れる前に「閉じる」ボタンをクリックすると、テストは成功します。それ以外の場合は失敗します。これは、「閉じる」ボタンが押されるまでプロセスが終了しないことを示しています。プロセスが終了することを期待している場合、このダイアログを表示せずに終了することを確認するにはどうすればよいですか?OSを「解決策を確認しない」に設定しようとしましたが、ダイアログが表示されます。「ソリューションを自動的にチェックする」に設定すると、ダイアログは回避されますが、最大10秒かかります。これは望ましくありません...そして、OSの設定は避けたいと思います。

AddInProcess.exeが動作を停止しました

4

1 に答える 1

6

次のように、アドインプロセス内のどこかで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 );
于 2011-09-21T16:26:06.673 に答える