Esto me llevó algo de trabajo, así que aquí hay documentación completa para programar una tarea desde un proyecto de instalación.
Una vez que haya creado su proyecto de implementación, necesitará usar Custom Actions para programar la tarea. Walkthrough: Creating a Custom Action
Nota: El tutorial le pide que agregue la salida principal al nodo de instalar, incluso si usted no planea en hacer cualquier cosa costumbre durante el paso Instalar. Esto es importante, así que no lo ignore como lo hice. La clase de instalador realiza cierta gestión de estado durante este paso y debe ejecutarse.
El siguiente paso es pasar el directorio de instalación a la acción personalizada. Esto se hace a través del CustomActionData property. Ingresé /DIR="[TARGETDIR]\"
para el nodo de confirmación (programo mi tarea durante el paso de confirmación). MSDN: CustomActionData Property
Finalmente, deberá acceder a la API de programación de tareas o utilizar Process.Start
para llamar al schtasks.exe. La API le brindará una experiencia más fluida y sólida, pero opté por la ruta schtasks porque tenía la línea de comandos a mano.
Aquí está el código con el que finalmente terminé. Lo registré como una acción personalizada para instalar, confirmar y desinstalar.
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();
}
}
}
Luego tendría que adjuntar ese script con el instalador y tener cuidado de eliminarlo después de programar el otro programa para que se ejecute. ¿No hay una buena manera de que el Asistente de configuración haga esto por mí? – mrduclaw
puede hacer cualquier cosa en el componente de configuración que pueda hacer en el script. – rerun