Доброго времени суток.
Имеется WPF приложение, развёртываемое через ClickOnce. Во время выполнения программы иногда возникает необходимость программного перезапуска приложения. Оное выполняется так:
Process.Start(Application.ResourceAssembly.Location);
Application.Current.Shutdown();
Но! После такого "рестарта" приложения ApplicationDeployment.IsNetworkDeployed возвращает false и, соответственно, к ApplicationDeployment.CurrentDeployment я обращаться не могу.
Вопрос: каким образом можно программно запустить приложение через ClickOnce?
Здравствуйте, 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