ClickOnce и WPF
От: v.makeev Россия  
Дата: 20.04.11 10:06
Оценка:
Доброго времени суток.
Имеется WPF приложение, развёртываемое через ClickOnce. Во время выполнения программы иногда возникает необходимость программного перезапуска приложения. Оное выполняется так:

Process.Start(Application.ResourceAssembly.Location);
Application.Current.Shutdown();


Но! После такого "рестарта" приложения ApplicationDeployment.IsNetworkDeployed возвращает false и, соответственно, к ApplicationDeployment.CurrentDeployment я обращаться не могу.
Вопрос: каким образом можно программно запустить приложение через ClickOnce?
wpf restart clickonce
Re: ClickOnce и WPF
От: ksg71 Германия  
Дата: 20.04.11 10:45
Оценка: 25 (3)
Здравствуйте, v.makeev, Вы писали:

VM>Вопрос: каким образом можно программно запустить приложение через ClickOnce?


выдрано рефлектором из Winforms application, работает в одном из проектов

public class RestartHelper 
    {
        enum HostType
        {
            Default,
            AppLaunch,
            CorFlag
        }

        [StructLayout(LayoutKind.Sequential)]
        [SuppressUnmanagedCodeSecurity]
        internal class PROCESS_INFORMATION
        {
             public IntPtr hProcess;
             public IntPtr hThread;
             public int dwProcessId;
             public int dwThreadId;

             private static readonly IntPtr INVALID_HANDLE_VALUE;
             static PROCESS_INFORMATION()
             {
                 INVALID_HANDLE_VALUE = new IntPtr(-1);
             }

             public PROCESS_INFORMATION()
             {
                 this.hProcess = IntPtr.Zero;
                 this.hThread = IntPtr.Zero;
             }

             ~PROCESS_INFORMATION()
             {
                 this.Close();
             }
            
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal void Close()
            {
                if ((this.hProcess != IntPtr.Zero) && (this.hProcess != INVALID_HANDLE_VALUE))
                {
                    CloseHandle(new HandleRef(this, this.hProcess));
                    this.hProcess = INVALID_HANDLE_VALUE;
                }
                if ((this.hThread != IntPtr.Zero) && (this.hThread != INVALID_HANDLE_VALUE))
                {
                    CloseHandle(new HandleRef(this, this.hThread));
                    this.hThread = INVALID_HANDLE_VALUE;
                }
            }

            [DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)]
            private static extern bool CloseHandle(HandleRef handle);
        }

        public void RestartApplication()
        {
            string updatedApplicationFullName = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName;
            App.Current.Shutdown();
            CorLaunchApplication((uint)HostType.CorFlag, updatedApplicationFullName, 0, null, 0, null, new PROCESS_INFORMATION());
        }

        [DllImport("mscorwks.dll", CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = false)]
        internal static extern void CorLaunchApplication(uint hostType, string applicationFullName, int manifestPathsCount, string[] manifestPaths, int activationDataCount, string[] activationData, PROCESS_INFORMATION processInformation);
    }
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re[2]: ClickOnce и WPF
От: v.makeev Россия  
Дата: 20.04.11 11:22
Оценка:
Здравствуйте, ksg71

Большое спасибо, помогло
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.