Разработка служб Windows в .Net 3.5 - PullRequest
2 голосов
/ 23 апреля 2009

В настоящее время я занимаюсь разработкой службы Windows с целью .Net 3.5.

У меня есть ряд проблем с этим:

  1. Несмотря на то, что у меня есть проект установки в решении, он не устанавливает службу (платформа - это перспектива) даже после успешного завершения программы установки. Я должен вручную установить службу, используя InstallUtil.exe, который находится в папке .Net 2.0, а не в папке 3.5.

  2. Я не могу получить доступ к app.config с помощью объекта ConfigrationManager. Я подозреваю, что это потому, что работающая служба не запускается из каталога установки. Кто-нибудь знает способ для меня, чтобы получить доступ к этому во время выполнения безопасно?

Буду очень признателен за любые советы и опыт по этому вопросу.

Джеймс

Ответы [ 4 ]

3 голосов
/ 23 апреля 2009

Я недавно сделал это сам, и вот код, который позволит вам передать «/ install» или «/ uninstall» в качестве опции командной строки для установки вашего сервиса. Вы можете изменить это для автоматической установки, если хотите. Он также обращается к app.config нормально (мой оригинальный сервис делает это в своем основном цикле). Как вы можете видеть, я настраиваю его для запуска под определенным пользователем, но вы можете установить spi.Account = ServiceAccount.LocalSystem; и пропустите имя и пароль. Надеюсь, это поможет:

namespace MyService
{   
    public class ServiceMonitor : ServiceBase
    {
        private System.ComponentModel.Container _components = null;
        private static string _service_name = "MyServiceName";

        public ServiceMonitor()
        {
            InitializeComponent();
        }

        private void InitializeComponent()
        {
            this.CanHandlePowerEvent = true;
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.CanStop = true;
            this.ServiceName = _service_name;
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && _components != null)
            {
                _components.Dispose();
            }
            base.Dispose(disposing);
        }

        static void Main(string[] args)
        {
            string opt = null;            

            if (args.Length >= 1)
            {
                opt = args[0].ToLower();
            }


            if (opt == "/install" || opt == "/uninstall")
            {
                TransactedInstaller ti = new TransactedInstaller();
                MonitorInstaller mi = new MonitorInstaller(_service_name);

                ti.Installers.Add(mi);

                string path = String.Format("/assemblypath={0}", Assembly.GetExecutingAssembly().Location);
                string[] cmdline = { path };

                InstallContext ctx = new InstallContext("", cmdline);

                ti.Context = ctx;

                if (opt == "/install")
                {
                    Console.WriteLine("Installing");
                    ti.Install(new Hashtable());
                }
                else if (opt == "/uninstall")
                {
                    Console.WriteLine("Uninstalling");
                    try
                    {
                        ti.Uninstall(null);
                    }
                    catch (InstallException ie)
                    {
                        Console.WriteLine(ie.ToString());
                    }
                }
            }
            else
            {
                ServiceBase[] services;
                services = new ServiceBase[] { new ServiceMonitor() };
                ServiceBase.Run(services);
            }
        }

        protected override void OnStart(string[] args)
        {
            //
            // TODO: spawn a new thread or timer to perform actions in the background.
            //
            base.OnStart(args);
        }

        protected override void OnStop()
        {
            //
            // TODO: stop your thread or timer
            //
            base.OnStop();
        }
    }

    [RunInstaller(true)]
    public class MonitorInstaller : Installer
    {
        public MonitorInstaller()
            : this("MyServiceName")
        {
        }

        public MonitorInstaller(string service_name)
        {
            ServiceProcessInstaller spi = new ServiceProcessInstaller();

            spi.Account = ServiceAccount.User;
            spi.Password = ConfigurationManager.AppSettings["Password"];
            spi.Username = ConfigurationManager.AppSettings["Username"];

            ServiceInstaller si = new ServiceInstaller();

            si.ServiceName = service_name;
            si.StartType = ServiceStartMode.Automatic;
            si.Description = "MyServiceName";
            si.DisplayName = "MyServiceName";

            this.Installers.Add(spi);
            this.Installers.Add(si);
        }
    }
}
2 голосов
/ 23 апреля 2009

Установка службы требует создания настраиваемого действия в вашем проекте установки, в противном случае он не регистрируется.

1 голос
/ 23 апреля 2009

Как уже говорили другие, вы должны создать проект установки, чтобы выполнить установку. Я также написал пакетные файлы, чтобы сделать это без установки.

Для помощи в создании проекта установки я нашел следующие ссылки полезными.

Как создать проект установки для приложения-службы Windows в Visual C #

Службы Windows в C #: Часть 2. Добавление установщика для службы Windows

Как: добавить установщики в приложение-службу

0 голосов
/ 09 февраля 2010
...