TopShelf İle Windows Servis Uygulaması | C#
Merhaba, Windows açılışında bazı uygulamaların otomatik başlaması için bir ufak konsol uygulaması yazdım.
Bunu da Tolshelf kullanarak Windows Servisi’ne çevirdim.
Örnek kodlar şu şekilde:
Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using Topshelf;
namespace ConsoleWinSrvBatStart
{
public class Program
{
/// <summary>
/// ConsoleWinSrvBatStart install diyerek kuruyoruz.
/// ConsoleWinSrvBatStart uninstall diyerek kaldiriyoruz.
/// </summary>
/// <param name="args"></param>
public static void Main(string[] args)
{
try
{
ayarlariYukle();
HostFactory.Run(hostConfig =>
{
hostConfig.Service<BaslangicService>(serviceConfig =>
{
serviceConfig.ConstructUsing(() => new BaslangicService());
serviceConfig.WhenStarted(s => s.Start());
serviceConfig.WhenStopped(s => s.Stop());
});
hostConfig.RunAs(@".\Administrator", @"Admin şifresi....");
hostConfig.StartAutomaticallyDelayed();
hostConfig.SetServiceName("BaslangicUygulamaCalistirmaServisi");
hostConfig.SetDisplayName("Baslangic Uygulama Calistirma Servisi");
hostConfig.SetDescription("Baslangic Uygulama Calistirma Servisi .Net 4.8 ve Topshelf kullanildi.");
hostConfig.OnException(ex =>
{
File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", Environment.NewLine + DateTime.Now.ToString("yyyyMMddHHmmss") + " : " + ex.ToString());
});
});
}
catch (Exception ex)
{
File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", ex.ToString());
}
}
static void ayarlariYukle()
{
Sabitler.LstUygulama = new List<Uygulama>();
XmlDocument xmlAyarlar = new XmlDocument();
xmlAyarlar.Load(Sabitler.UygulamaDizini + "/Settings.xml");
XmlNodeList lstUygulama = xmlAyarlar.SelectNodes("/KOK/Uygulama");
foreach (XmlNode node in lstUygulama)
{
string tur = node.Attributes["Turu"].Value;
int beklemeSuresi = Convert.ToInt32(node.Attributes["BeklemeSuresi"].Value);
string yol = node.Attributes["Yolu"].Value;
if (!string.IsNullOrEmpty(yol))
{
Sabitler.LstUygulama.Add(new Uygulama() { Turu = tur, BeklemeSuresi = beklemeSuresi, Yolu = yol });
}
}
}
}
}
Settings.xml
Settings.xml
<?xml version="1.0" encoding="utf-8" ?>
<KOK>
<Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasRmiRegistry.bat" />
<Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasControl.bat" />
<Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasServer-S1.bat" />
<Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasServer-S2.bat" />
<Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasServer-S3.bat" />
<Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\iasLoadbalancer.bat" />
<Uygulama Turu="BAT" BeklemeSuresi="10" Yolu="d:\canias\iasAppServers\5-iasWebSrv.bat" />
<Uygulama Turu="EXE" BeklemeSuresi="10" Yolu="" />
<Uygulama Turu="SERVICE" BeklemeSuresi="10" Yolu="" />
</KOK>
BaslangicService.cs
using System;
using System.Diagnostics;
using System.IO;
using System.ServiceProcess;
using System.Threading;
namespace ConsoleWinSrvBatStart
{
public class BaslangicService
{
public void Start()
{
foreach (Uygulama item in Sabitler.LstUygulama)
{
switch (item.Turu)
{
case Sabitler.UygulamaTuruBat:
string batFilePath = item.Yolu;
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = "cmd.exe";
processInfo.Arguments = $"/c \"{batFilePath}\"";
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardError = true;
processInfo.UseShellExecute = false;
processInfo.CreateNoWindow = false;
processInfo.WorkingDirectory = Path.GetDirectoryName(batFilePath); ; // BAT dosyasının bulunduğu dizin
Process processStartBat = new Process();
processStartBat.StartInfo = processInfo;
processStartBat.Start();
break;
case Sabitler.UygulamaTuruExe:
Process processStart = new Process();
processStart.StartInfo.FileName = item.Yolu;
processStart.Start();
break;
case Sabitler.UygulamaTuruServis:
ServiceController controller = new ServiceController(item.Yolu);
if (controller.Status == ServiceControllerStatus.Stopped || controller.Status == ServiceControllerStatus.Paused)
controller.Start();
break;
default:
break;
}
Thread.Sleep(item.BeklemeSuresi * 1000);
}
}
public void Stop()
{
foreach (Uygulama item in Sabitler.LstUygulama)
{
Process[] allProcesses = Process.GetProcesses();
try
{
switch (item.Turu)
{
case Sabitler.UygulamaTuruBat:
// Batlari Windows Servis uygulamasi ile baslatinca BAT isimlerinde yakalayamiyoruz maalesef.
foreach (Process processBat in allProcesses)
{
if (processBat.ProcessName == "conhost"
|| processBat.ProcessName == "cmd"
|| processBat.ProcessName == "java")
{
try
{
if (!processBat.HasExited)
{
processBat.Kill();
processBat.WaitForExit();
}
}
catch (Exception ex)
{
File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", Environment.NewLine + DateTime.Now.ToString("yyyyMMddHHmmss") + " : Process Name : " + processBat.ProcessName + ", Id : " + "" + processBat.Id + ", " + ex.ToString());
}
}
}
// Eger isimden yakalamak mumkun olsaydi asagidaki sekilde yakalayip sonlandirabiliyorduk.
//////foreach (Process process in cmdProcesses)
//////{
////// if (process.MainWindowTitle.Contains(Path.GetFileName(item.Yolu)))
////// {
////// ///Once alt islemleri halledelim...
////// ManagementObjectSearcher searcher = new ManagementObjectSearcher($"SELECT * FROM Win32_Process WHERE ParentProcessId={process.Id}");
////// foreach (ManagementObject obj in searcher.Get())
////// {
////// int childProcessId = Convert.ToInt32(obj["ProcessId"]);
////// Process childProcess = Process.GetProcessById(childProcessId);
////// childProcess.Kill();
////// }
////// ///Sonra ana islemi...
////// process.Kill();
////// }
//////}
break;
case Sabitler.UygulamaTuruExe:
case Sabitler.UygulamaTuruServis:
string islemAdi = item.Turu == Sabitler.UygulamaTuruServis ? item.Yolu : Path.GetFileName(item.Yolu);
foreach (Process servisProcess in allProcesses)
{
if (servisProcess.ProcessName == islemAdi)
{
try
{
if (!servisProcess.HasExited)
{
servisProcess.Kill();
servisProcess.WaitForExit();
}
}
catch (Exception ex)
{
File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", Environment.NewLine + DateTime.Now.ToString("yyyyMMddHHmmss") + " : Process Name : " + servisProcess.ProcessName + ", Id : " + "" + servisProcess.Id + ", " + ex.ToString());
}
}
}
break;
default:
break;
}
}
catch (Exception ex)
{
File.AppendAllText(Sabitler.UygulamaDizini + "/ServiceLogg.txt", DateTime.Now.ToString("yyyyMMddHHmmss") + " : " + ex.ToString());
}
}
}
}
}
Selamlar.