代码之家  ›  专栏  ›  技术社区  ›  ZeBT

返回自定义Silverlight OOB应用程序出口代码

  •  1
  • ZeBT  · 技术社区  · 13 年前

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

    以下是对Visual Studio生成的默认SilverlightApplication所做的唯一更改,除了对项目属性进行调整以启用OOB提升信任之外:

    在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应用程序提供的退出代码?

    1 回复  |  直到 9 年前
        1
  •  1
  •   skrebbel    12 年前

    我打电话给 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);
        }
    

    然而,这个代码让我非常紧张: 终止进程 是一个相当讨厌的“立即终止开关”——这种呼叫会立即终止 sllauncher.exe 如果 sllauncher.exe 通常在Silverlight应用程序关闭后进行任何类型的清理,我认为可能会这样,但现在省略了清理。我对采取这种做法非常谨慎。

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

    我可能需要P/Invoke到Windows API来查找临时目录,然后向其中写入一个文件,并从父进程中读取该文件。

    (注意:这是Silverlight 5。我不确定在SL4上你能在多大程度上P/Invoke)