Создаём свою службу на C#
Здесь я не буду приводить подробных инструкций, какую кнопочку необходимо нажать и какую менюшку ткнуть в Visual Studio. Здесь я остановлюсь на основных двух проблемных моментах с которыми сам столкнулся при создании собственной службы.
Первый момент. Собственно служба должна что нибудь делать, это что нибудь обычно делается по таймеру, вот он то никак и не запускался. Не работал, и всё тут! Выяснилось что обычный таймер System.Windows.Forms.Timer работает только на основе оконных сообщений! Находил информацию по поводу того что можно и без этого запустить как: System.Timers.Timer или System.Threading.Timer — но с ними тоже ничего не получилось. Вернулся к первому варианту, просто в отдельном потоке создал форму и таймер, ниже пример.
public partial class Service1 : ServiceBase
{
System.Windows.Forms.Timer timer1;
System.Windows.Forms.Form form1;
System.Threading.Thread thread1;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//При запуске службы запускаем новый поток
thread1 = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
thread1.Start();
thread1.IsBackground = true;
}
void ThreadProc()
{
//Создаем во вновь созданном потоке форму и таймер
form1 = new System.Windows.Forms.Form();
timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer_Tick);
timer1.Interval = 2000;
timer1.Start();
form1.Show();
//Запускаем всё это добро.
System.Windows.Forms.Application.Run(form1);
}
protected override void OnStop()
{
thread1.Abort();
}
private void timer_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
timer1.Stop();
runProcedure(); //Запускаем процедуру (чего хотим выполнить по таймеру).
timer1.Enabled = true;
timer1.Start();
}
}
Собственно вот так вот таймер и запустил в службе, ничего сложного, тяп ляп и всё заработало.
Но не тут то было!
Второй момент!
Как это всё теперь установить? Так чтобы это всё было в службах и запускалось само и работало.
Для того чтобы установить написанную на C# службу потребуется утилита «InstallUtil.exe» — находится она в папке с .NET 2 — у меня нашлось конкретно вот в этой папочке: C:\Windows\Microsoft.NET\Framework\v2.0.50727. У меня там было ещё куча версий, но нужный файлик был именно там.
Чтобы не прописывать пути скопировал из этой папки файлики InstallUtil.exe и InstallUtilLib.dll в папку с скомпилированным проектом службы, и запускал инсталл вот такой строчкой:
InstallUtil.exe /i MyService.exe
Но это не сработает если предварительно в проект не добавить Класс Инсталлера, делается это так: кликаете правой кнопкой мыши по Пустому месту в Дизайнере службы (в моём случае вкладка Service1.cs[Design]) и кликаете по менюшке «Add Installer». Собственно всё. После этого действия появится вкладка «Project Installer» — там в свойствах ServiceInstaller задаём название и описание нашей службы, а в свойствах ServiceProcessInstaller — от чьего имени будет выполняться служба. Если поставите в свойстве Account > User — то при установке служба спросит имя пользователя и пароль от которого будет запускаться.
Вот собственно и всё.