返回自定义Silverlight OOB应用程序ExitCode

时间:2013-02-20 00:08:33

标签: silverlight silverlight-4.0 exit-code silverlight-oob out-of-browser

我想自定义我的提升信任,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" syntax via命令提示符启动OOB应用程序,并确保设置了Windowed应用程序的退出代码,即:

start /wait sllauncher.exe 1899735003.localhost

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

echo Exit Code is %errorlevel%

退出代码始终设置为0.

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

1 个答案:

答案 0 :(得分:1)

我设法通过调用TerminateProcess Windows 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。如果在关闭Silverlight应用程序后sllauncher.exe通常会进行任何类型的清理,我认为它可能会清除,现在省略了清理。我很谨慎采取这种方法。

我认为与父进程“通信”的另一种方法是将一些退出代码写入临时文件,但是Silverlight的Environment.GetSpecialFolder调用不允许我访问临时目录等任何内容。 / p>

我可能不得不通过P / Invoke到Windows API来查找临时目录,然后将文件写入其中,然后从父进程读取它。

(注意:这是Silverlight 5.我不确定在SL4上你可以在多大程度上进行P / Invoke)