1

昇格した信頼のOutofBrowser(OOB)Silverlight4アプリケーションの終了コードをカスタマイズしたいと思います。現在、 System.Environment.ExitCodeプロパティを使用してSL4アプリの終了値をカスタマイズしようとしていますが、sllauncher.exeによってオーバーライドされており、常に0を返しているようです。

OOB Elevated Trustを有効にするためのプロジェクトプロパティの調整以外に、VisualStudioによって生成されたデフォルトのSilverlightApplicationに加えられた唯一の変更は次のとおりです。

MainPage.xaml.csで:

public MainPage()
{
    InitializeComponent();
    Environment.ExitCode = 42;
}

また、予防措置としてApp.xaml.csを更新しました。

private void Application_Exit(object sender, EventArgs e)
{
    Environment.ExitCode = 42;
}

XAPがローカルシステムにインストールされたら、コマンドプロンプトで「start / wait」構文を使用してOOBアプリを起動し、ウィンドウアプリケーションの終了コードが設定されていることを確認します。

start /wait sllauncher.exe 1899735003.localhost

アプリを閉じた後、フォーカスをコマンドプロンプトに戻し、次の手順を実行します。

echo Exit Code is %errorlevel%

終了コードは常に0に設定されます。

sllauncherにOOBアプリによって提供される終了コードを設定させる方法はありますか?

4

1 に答える 1

1

Windows API呼び出しを呼び出すことで、なんとかそれを行うことができましたTerminateProcess:(これをしないでください! )

    [DllImport("kernel32.dll")]
    static extern int TerminateProcess(IntPtr processIdOrHandle, uint exitCode);

    [DllImport("kernel32.dll")]
    static extern IntPtr GetCurrentProcess();

    public static void Exit(uint code) {
         TerminateProcess(GetCurrentProcess(), code);
    }

しかし、コードは私を非常に緊張させます:TerminateProcessはかなり厄介な「即時キルスイッチ」のようなもので、すぐにsllauncher.exe. sllauncher.exe通常、Silverlight アプリケーションを閉じた後に何らかの種類のクリーンアップを行う場合 (おそらくそうなると思います)、そのクリーンアップは省略されています。私はこのアプローチを取ることに非常に警戒しています。

親プロセスと「通信」する別の方法は、一時ファイルに終了コードを書き込むことだと思いましたが、Silverlight のEnvironment.GetSpecialFolder呼び出しでは、一時ディレクトリのようなものにはアクセスできません。

おそらく、Windows API に P/Invoke して一時ディレクトリを見つけ、そこにファイルを書き込み、親プロセスからそれを読み取る必要があります。

(注: これは Silverlight 5 でした。SL4 でどの程度 P/Invoke できるかはわかりません)

于 2013-09-02T13:23:37.887 に答える