【问题标题】:Return Custom Silverlight OOB Application ExitCode返回自定义 Silverlight OOB 应用程序退出代码
【发布时间】:2013-11-06 21:04:49
【问题描述】:

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

start /wait sllauncher.exe 1899735003.localhost

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

echo Exit Code is %errorlevel%

退出代码始终设置为 0。

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

【问题讨论】:

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


    【解决方案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。如果sllauncher.exe 通常在 Silverlight 应用程序关闭后进行任何类型的清理(我认为可能),那么现在将省略该清理。我对采用这种方法非常谨慎。

    我认为与父进程“通信”的另一种方法是将退出代码写入临时文件,但是 Silverlight 的 Environment.GetSpecialFolder 调用不允许我访问临时目录之类的东西。

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

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

    【讨论】:

    • 我再也没有回来更新线程,但我最终还是按照您上面的建议写入了本地文件。谢谢!
    • 哟!感谢您留下意见。我最终使用了我认为更安全的选择:我们已经有一个用 C++ 编写的启动器进程,所以我选择使用内存映射文件。在启动器中,我使用CreateFileMappingMapViewOfFile 创建了一个大约100 字节的内存映射文件,并将其初始化为一个空的以null 结尾的字符串。然后,从 Silverlight 中,我也将 DllImport MapViewOfFile 导入,并以空终止字符串的形式写入我想要与启动器进程通信的任何信息。
    • 有趣的方法。我们没有单独的启动器进程,但需要牢记这一点。谢谢!
    • 虽然,Silverlight 的 DLLImport 仅适用于 Windows,不会与 OS X 交叉兼容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多