1

Я хотел бы настроить код выхода моего приложения с повышенным доверием, вне браузера (OOB) Silverlight 4. В настоящее время я пытаюсь использовать свойство System.Environment.ExitCode для настройки значения выхода моего приложения SL4, однако он кажется, что он переопределяется sllauncher.exe и всегда возвращает 0.Возврат Пользовательский Silverlight OOB-приложение ExitCode

Вот только изменения, внесенные в по умолчанию SilverlightApplication генерируется Visual Studio, вне корректировки свойств проекта, чтобы позволить OOB Повышенных 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 и убедитесь, что код выхода приложения оконным устанавливается, с помощью командной строки, а именно:

start /wait sllauncher.exe 1899735003.localhost 

После закрытия приложения, тем самым возвращая фокус в командной строке, и выполнив команду:

echo Exit Code is %errorlevel% 

выходу Код всегда устанавливается на 0.

есть ли способ га ve sllauncher устанавливает код выхода, предоставляемый приложением OOB?

ответ

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 довольно противным «немедленным kill switch "- вызов вызова, который немедленно убьет sllauncher.exe. Если sllauncher.exe обычно выполняет любую очистку после закрытия приложения Silverlight, который, как я полагаю, может быть, эта очистка теперь опущена. Я очень опасаюсь принять такой подход.

Я понял, что другой способ «обмениваться информацией» с родительским процессом заключается в написании кода кода во временном файле, однако вызов Silverlight Environment.GetSpecialFolder не дает мне доступа ко всему, что относится к временному каталогу.

Возможно, мне придется выполнить P/Invoke в Windows API, чтобы найти временный каталог, а затем записать файл в него и прочитать это из родительского процесса.

(примечание: это было Silverlight 5. Я не уверен, в какой степени вы можете P/Invoke вообще на SL4)

+0

Я никогда не вернулся, чтобы обновить нить, но я в конечном итоге прибегать к письменной форме локальный файл, как вы сказали выше. Благодаря! – ZeBT

+0

Yo! Спасибо, что оставили комментарий. Я закончил использовать то, что, по моему мнению, более безопасный вариант: у нас уже был процесс запуска, написанный на C++, поэтому я пошел на использование файлов с отображением памяти. В пусковой установке я создаю файл с отображением памяти размером 100 байт с помощью «CreateFileMapping» и «MapViewOfFile» и инициализирует его пустой строкой с нулевым завершением. Затем, из Silverlight, I DllImport «MapViewOfFile» тоже, и напишите в виде строки с нулевым завершением любую информацию, которую я хочу передать обратно в мой процесс запуска. – skrebbel

+0

Интересный подход. У нас нет отдельного процесса запуска, но это то, что нужно помнить. Благодаря! – ZeBT

Смежные вопросы