Удаление службы - C#
Формулировка задачи:
Всем привет...Проблема вот в чем:
Я написал некую службу, и мне необходимо её удалить программно...
Делаю так:
Так вот...если я запускаю мой файл сервиса с параметром /uninstall, то служба удаляется...Всё как должно быть...Но мне нужно, чтоб сервис сам себя удалил, поэтому делаю так:
Соответственно вот код файла delete.exe
Так вот...если я сам запущу файл delete.exe, то служба удалится, но если этот файл был запущен из сервиса (как и должно быть), то служба не удаляется.
ti.Uninstall(null); выдаёт исключение:
Как решить даннуж пробему?
static void Main(string[] args)
{
if (args.Length > 0)
{
if (args[0] != null && args[0].ToLower() == "/uninstall") UnInstall();
}
else
{
// Запуск службы //
}
}
private static void UnInstall()
{
TransactedInstaller ti = new TransactedInstaller();
ProjectInstaller mi = new ProjectInstaller();
ti.Installers.Add(mi);
String path = String.Format("/assemblypath={0}", Assembly.GetExecutingAssembly().Location);
String[] cmdline = { path };
InstallContext ctx = new InstallContext("", cmdline);
ti.Context = ctx;
ti.Uninstall(null);
}static void Main(string[] args)
{
if (args.Length > 0)
{
if (args[0] != null && args[0].ToLower() == "/uninstall") UnInstall();
}
else
{
// Запуск службы //
if (delete)//Если нужно удалить
{
string filename = path + @"\MyService.exe"; //Путь до файла
string delname = path + @"\delete.exe"; //Программа, которая запустит файл с параметром /uninstall
Process proc = new Process();
proc.StartInfo.WorkingDirectory = path;
proc.StartInfo.FileName = delname;
proc.StartInfo.Arguments = filename;
proc.Start();
}
}
}static void Main(string[] args)
{
if (args.Length > 0)
{
string filename = args[0];
if(!new FileInfo(filename).Exist)return;
Thread.Sleep(10000);//Ждём чтоб служба остановилась
Process.Start(filename, "/uninstall");
}
}
При удалении из системы возникло исключение. Это исключение будет проигнорировано, и удаление из системы будет продолжено. Однако после завершения удаления данное приложение может оказаться не полностью удаленным.
в System.Configuration.Install.Installer.Uninstall(IDictionary savedState)
в System.Configuration.Install.TransactedInstaller.Uninstall(IDictionary savedState)
в WiWUpdateService.Program.UnInstall()
Решение задачи: «Удаление службы»
textual
Листинг программы
private static void UnInstall(string serviceName, int timeoutMilliseconds, string path)
{
ServiceController service = new ServiceController(serviceName);
try
{
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
Process.Start(path, "/uninstall");
}
catch
{
// ...
}
}