1

我想自定义提升信任的退出代码,即 Out of Browser (OOB) Silverlight 4 应用程序。我目前正在尝试使用System.Environment.ExitCode属性来自定义我的 SL4 应用程序的退出值,但是,它似乎被 sllauncher.exe 覆盖并且始终返回 0。

以下是对 Visual Studio 生成的默认 SilverlightApplication 所做的唯一更改,除了调整项目属性以启用 OOB Elevated Trust:

在 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 应用程序并确保设置了 Windowed 应用程序的退出代码,即:

start /wait sllauncher.exe 1899735003.localhost

关闭应用程序后,将焦点返回到命令提示符,然后运行:

echo Exit Code is %errorlevel%

退出代码始终设置为 0。

有没有办法让 sllauncher 设置 OOB 应用程序提供的退出代码?

4

1 回答 1

1

我设法通过调用TerminateProcessWindows API 来做到这一点:(不要这样做!

    [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调用不允许我访问临时目录之类的东西。

我可能不得不 P/Invoke 到 Windows API 以找到临时目录,然后向其中写入一个文件,并从父进程中读出它。

(注意:这是 Silverlight 5。我不确定您在 SL4 上可以 P/Invoke 到什么程度)

于 2013-09-02T13:23:37.887 回答