Подтвердить что ты не робот

Служба автоматической установки Windows в .NET С#

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

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

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) ...
4b9b3361

Ответ 1

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

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 constructor
            serviceInstaller.ServiceName = "My Service";
            this.Installers.Add(processInstaller);
            this.Installers.Add(serviceInstaller);
        }
    }
}

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Проверьте эту статью.