Мне потребовалось некоторое время на сборку, поэтому вот полная документация по планированию задачи из проекта установки.
После создания проекта развертывания вам потребуется использовать Пользовательские действия, чтобы запланировать задачу. Пошаговое руководство. Создание пользовательского действия
Примечание. В пошаговом руководстве вам будет предложено добавить основной вывод в узел «Установка», даже если вы не планируете выполнять какие-либо действия на этапе «Установка». Это важно, поэтому не игнорируйте это, как я. Класс установщика выполняет некоторое управление состоянием на этом шаге, и его необходимо запустить.
Следующим шагом является передача каталога установки пользовательскому действию. Это делается с помощью свойства CustomActionData. Я ввел /DIR="[TARGETDIR]\"
для узла фиксации (я планирую свою задачу на этапе фиксации). MSDN: свойство CustomActionData
Наконец, вам потребуется либо получить доступ к API планирования задач, либо использовать Process.Start
для вызова schtasks.exe. API даст вам более плавный и надежный опыт, но я выбрал маршрут schtasks, потому что у меня была удобная командная строка.
Вот код, который я в конечном итоге получил. Я зарегистрировал его как настраиваемое действие для установки, фиксации и удаления.
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();
}
}
}
person
AaronSieb
schedule
10.05.2011