5

sto distribuzione di un'applicazione C# utilizzando il progetto di installazione guidata in Visual Studio 2008.Vista Pianifica attività Dall'installazione

Qual è il modo più semplice per me avere di Windows Pianificazione applicazione per l'esecuzione a intervalli regolari (ad esempio, ogni 8 ore)? Preferisco se questa pianificazione si verifica durante l'installazione dell'applicazione per semplificare la configurazione per l'utente finale.

Grazie!

risposta

0

L'attività pianificata è la strada da percorrere. Dai un'occhiata a questa pagina per come configurare l'attività con uno script.

+0

Quindi dovrei raggruppare quello script con l'installer e occuparmi di eliminarlo dopo che programma l'altro programma da eseguire. Non c'è solo un buon modo per fare in modo che l'installazione guidata lo faccia per me? – mrduclaw

+0

puoi fare qualsiasi cosa nel componente di configurazione che potresti fare nello script. – rerun

10

Questo ha richiesto un po 'di raccolta per me, quindi ecco la documentazione completa per la pianificazione di un compito da un progetto di installazione.

Una volta creato il progetto di distribuzione, sarà necessario utilizzare Custom Actions per pianificare l'attività. Walkthrough: Creating a Custom Action

Nota: La procedura dettagliata chiede di aggiungere l'output primario al nodo di installare, anche se non si ha intenzione di fare qualcosa di personalizzato durante la fase di installazione. Questo è importante, quindi non ignorarlo come ho fatto io. La classe di installazione esegue alcuni stati durante questo passaggio e deve essere eseguita.

Il passaggio successivo consiste nel passare la directory di installazione all'azione personalizzata. Questo viene fatto tramite lo CustomActionData property. Ho inserito /DIR="[TARGETDIR]\" per il nodo di commit (programma la mia attività durante la fase di commit). MSDN: CustomActionData Property

Infine, è necessario accedere all'API di pianificazione attività oppure utilizzare Process.Start per chiamare schtasks.exe. L'API ti fornirà un'esperienza più fluida e solida, ma sono andato con il percorso schtasks perché avevo a portata di mano la riga di comando.

Ecco il codice con cui alla fine sono arrivato. L'ho registrato come azione personalizzata per l'installazione, il commit e la disinstallazione.

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Configuration.Install; 
using System.Linq; 
using System.Security.Permissions; 
using System.Diagnostics; 
using System.IO; 


namespace MyApp 
{ 
    [RunInstaller(true)] 
    public partial class ScheduleTask : System.Configuration.Install.Installer 
    { 
     public ScheduleTask() 
     { 
      InitializeComponent(); 
     } 

     [SecurityPermission(SecurityAction.Demand)] 
     public override void Commit(IDictionary savedState) 
     { 
      base.Commit(savedState); 

      RemoveScheduledTask(); 

      string installationPath = Context.Parameters["DIR"] ?? ""; 
      //Without the replace, results in c:\path\\MyApp.exe 
      string executablePath = Path.Combine(installationPath, "MyApp.exe").Replace("\\\\", "\\"); 

      Process scheduler = Process.Start("schtasks.exe",string.Format("/Create /RU SYSTEM /SC HOURLY /MO 2 /TN \"MyApp\" /TR \"\\\"{0}\\\"\" /st 00:00", executablePath)); 
      scheduler.WaitForExit(); 
     } 

     [SecurityPermission(SecurityAction.Demand)] 
     public override void Uninstall(IDictionary savedState) 
     { 
      base.Uninstall(savedState); 
      RemoveScheduledTask(); 
     } 

     private void RemoveScheduledTask() { 
      Process scheduler = Process.Start("schtasks.exe", "/Delete /TN \"MyApp\" /F"); 
      scheduler.WaitForExit(); 
     } 
    } 
} 
+0

Punteggio! Bella risposta, risparmiato metà della mia giornata ;-) –

Problemi correlati