2016-07-28 11 views
5

Ich habe einen Updater, der über das Hauptprogramm aufgerufen wird, sobald ein Update erkannt wird (aus einer entfernten XML-Datei). Zuerst wird geprüft, ob der Prozess geöffnet ist.Mein Updater schließt mein Hauptprogramm nicht (C#)

if (clsProcess.ProcessName.ToLower().Contains("conkinator-bot.exe")) 
{ 

    clsProcess.CloseMainWindow(); 
    return true; 

} 

(dies wird für jeden Prozess laufen, bis er es (foreach-Schleife) findet)

der Updater lädt dann die Datei:

client.DownloadFile(url, "Conkinator-Bot-new.exe"); 

und dann versucht er, die aktuelle und r zu löschen ENAME es:

File.Delete("Conkinator-Bot.exe"); 
File.Move("Conkinator-Bot-new.exe", "Conkinator-Bot.exe"); 

aber die Fehler, die ich bekomme, wenn dies die folgenden auftritt:

Unbehandelte Ausnahme: System.UnauthorizedAccessException: Zugriff auf den Pfad ‚D: \ Conkinator Skype-Tool \ Conkinator- Bot.exe wird abgelehnt.

jedoch die neue Version des Programms DOES Download.

+0

Versuchen Sie, Ihre Update-Prozess als Administrator – Glubus

+0

@Glubus ausgeführt wird, wenn ich es tue, die meiste Zeit noch funktioniert es nicht, manchmal tut es. –

+0

Versuchen Sie, eine kleine Verzögerung hinzuzufügen, bevor Sie die Datei herunterladen, da Ihr Prozess vielleicht etwas Zeit benötigt, um sich selbst zu schließen. –

Antwort

6

Nur weil das Hauptfenster geschlossen ist bedeutet nicht, dass der Prozess vorbei ist. Sie müssen für den Prozess warten, um zu beenden, nachdem Sie das Hauptfenster schließen:

clsProcess.WaitForExit(); 

Idealerweise verfügen Sie einen Timeout verwenden würden - es etwas sein könnte, das Fenster schließt, oder der Prozess verhindert möglicherweise einen fehlerhaften Ausgang hat Mechanismus.

+0

Das hat funktioniert, als ich es gerade jetzt getestet habe :) danke –

2

Es ist viel einfacher, das Hauptprogramm aus dem Hauptprogramm selbst zu schließen.

string msg = "To update the application we need to close it. Do you want to continue?"; 
    if (DialogResult.Yes == MessageBox.Show(msg, title, MessageBoxButtons.YesNo)) 
    { 
    ProcessStartInfo psi = new ProcessStartInfo(); 
    psi.FileName = "YourUpdaterFile.exe";   
    psi.WindowStyle = ProcessWindowStyle.Normal; 
    // Assuming a lot here but to just show the options available.... 
    psi.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath); 
    Process.Start(psi); 
    Application.Exit(); 
    }