Самостоятельная установка Windows Service в .NET - PullRequest
39 голосов
/ 10 ноября 2010

Я прочитал этот вопрос .У меня та же проблема, но я не понимаю ответ от lubos hasko.Как именно я могу это сделать?Можете ли вы кто-нибудь опубликовать мне полное пошаговое руководство?

Когда я запускаю код ниже, что-то установлено, но в списке служб, я не смог найти его.:

using System;
using System.Collections.Generic;
using System.Configuration.Install;
using System.Linq;
using System.Reflection;
using System.ServiceProcess;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{

public class Service1 : ServiceBase
{
    public Service1()
    {
        File.AppendAllText("sss.txt", "ccccc");
    }

    protected override void OnStart(string[] args)
    {
        File.AppendAllText("sss.txt", "asdfasdf");
    }

    protected override void OnStop()
    {
        File.AppendAllText("sss.txt", "bbbbb");
    }


    static void Main(string[] args)
    {
        if (System.Environment.UserInteractive)
        {
            string parameter = string.Concat(args);
            switch (parameter)
            {
                case "--install":
                    ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
                    break;
                case "--uninstall":
                    ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
                    break;
            }
        }
        else
        {
            ServiceBase.Run(new Service1());
        }


        Console.ReadKey();
    }
 }
}

Я тоже не понял:

if (System.Environment.UserInteractive) ...

Ответы [ 3 ]

79 голосов
/ 10 ноября 2010

Это моё полное решение, и оно работает. Это в основном тот же ответ, что и в этом вопросе.

using System;
using System.Configuration.Install;
using System.Reflection;
using System.ServiceProcess;
using System.IO;

namespace ConsoleApplication1
{
    class Program : ServiceBase
    {
        static void Main(string[] args)
        {

            AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;


            if (System.Environment.UserInteractive)
            {
                string parameter = string.Concat(args);
                switch (parameter)
                {
                    case "--install":
                        ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
                        break;
                    case "--uninstall":
                        ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
                        break;
                }
            }
            else
            {
                ServiceBase.Run(new Program());
            }



        }

        private static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            File.AppendAllText(@"C:\Temp\error.txt", ((Exception)e.ExceptionObject).Message + ((Exception)e.ExceptionObject).InnerException.Message);
        }

        public Program()
        {
            this.ServiceName = "My Service";
            File.AppendAllText(@"C:\Temp\sss.txt", "aaa");

        }

        protected override void OnStart(string[] args)
        {
            base.OnStart(args);

            File.AppendAllText(@"C:\Temp\sss.txt", "bbb");
        }

        protected override void OnStop()
        {
            base.OnStop();

            File.AppendAllText(@"C:\Temp\sss.txt", "ccc");
        }
    }
}

и в том же проекте создайте этот класс:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace ConsoleApplication1
{
    [RunInstaller(true)]
    public class MyWindowsServiceInstaller : Installer
    {
        public MyWindowsServiceInstaller()
        {
            var processInstaller = new ServiceProcessInstaller();
            var serviceInstaller = new ServiceInstaller();

            //set the privileges
            processInstaller.Account = ServiceAccount.LocalSystem;

            serviceInstaller.DisplayName = "My Service";
            serviceInstaller.StartType = ServiceStartMode.Automatic;

            //must be the same as what was set in Program's constructor
            serviceInstaller.ServiceName = "My Service";
            this.Installers.Add(processInstaller);
            this.Installers.Add(serviceInstaller);
        }
    }
}

Запустите эту программу с параметрами --install / - uninstall от имени администратора в Windows 7. Проверьте журнал ошибок в temp. Проверьте рабочий журнал по тому же пути.

1 голос
/ 10 ноября 2010

Прежде всего, в конструкторе Service1 установите свойство ServiceName.

Выдержка из MSDN :

Минимум, который необходимо реализовать в конструкторекласс, унаследованный от ServiceBase, предназначен для установки ServiceName в вашем компоненте.Никакой другой обработки специально не требуется в конструкторе.Вы должны обрабатывать большую часть инициализации в OnStart, а не в конструкторе.

Во-вторых, вам нужно передать аргументы вашему сервису при запуске из командной строки.--install для установки, --uninstall для удаления - посмотрите на оператор switch, он делает это на входных аргументах.

0 голосов
/ 10 ноября 2010

System.Environment.UserInteractive свойство говорит вам, что будь то процесс Windows или служба, подобная IIS, которая работает без пользовательского интерфейса.

Если это свойство имеет значение false, не отображать модальные диалоговые окна или окна сообщений, поскольку пользователь не взаимодействует с графическим интерфейсом пользователя. Источник

Отметьте эту статью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...