Self install Windows Service in .NET

后端 未结 3 1798
眼角桃花
眼角桃花 2020-12-12 17:40

I have read this question. I have same issue, but I don\'t understand the answer from lubos hasko. How exactly can I do it? Can you someone post me full walkthrough?

3条回答
  •  醉话见心
    2020-12-12 18:03

    This is my complete solution, and it works. It is basically the same answer as in this question.

    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");
            }
        }
    }
    

    and in same project create this class:

    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);
            }
        }
    }
    

    Run this program with parameters --install/--uninstall as Administrator on Windows 7. Check the error log in temp. Check working log on the same path.

提交回复
热议问题