J Hunt
J Hunt

Reputation: 791

C# command prompt app to windows service - How to create an installer class

How do I convert a command prompt app to a windows service? So far this is what I have, but when I try to install it with InstallUtil.exe I'm received an error:

No public installers with the RunInstallerAttribute.Yes attribute could be found in the ....

I didn't know I had to create an installer class and I'm not sure how to go about this. Can someone help me by telling me how to write an installer class so that I can install my app as a windows service?

   class Program
   {
    public const string ServiceName = "ProcessingApp";

    public class Service : ServiceBase
    {
        public Service()
        {
            ServiceName = Program.ServiceName;
        }

        protected override void OnStart(string[] args)
        {
            Program.Start(args);
        }

        protected override void OnStop()
        {
            Program.Stop();
        }
    }

    private static void Start(string[] args)
    {
        // onstart code here
        StartCode();
    }

    private static void Stop()
    {
        // onstop code here

        ServiceController service = new ServiceController(ServiceName);
        try
        {
            TimeSpan timeout = TimeSpan.FromMilliseconds(100000);

            service.Stop();
            service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
        }
        catch
        {

        }

    }

    static void Main(string[] args)
    {
        if (!Environment.UserInteractive)
            // running as service
            using (var service = new Service())
                ServiceBase.Run(service);
        else
        {
            // running as console app
            Start(args);

            Console.WriteLine("Press any key to stop...");
            Console.ReadKey(true);

            Stop();
        }

Upvotes: 1

Views: 88

Answers (1)

Marc Gravell
Marc Gravell

Reputation: 1063501

For that to work, you need to have a class that inherits from System.Configuration.Install.Installer in System.Configuration.Install.dll. TThe constructor should configure a ServiceProcessInstaller and a ServiceInstaller, and add them both to the Installers collection - setting the Account, StartType, ServiceName, Description, etc.

MSDN has an example: https://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceprocessinstaller(v=vs.110).aspx

Upvotes: 1

Related Questions