programing

Topshelf 애플리케이션을 Windows 서비스로 설치

nasanasas 2020. 12. 4. 08:23
반응형

Topshelf 애플리케이션을 Windows 서비스로 설치


Visual Studio Express 2012를 사용하여 Topshelf (버전 3.1.107.0)를 사용하여 콘솔 응용 프로그램을 만들었습니다. 응용 프로그램은 콘솔 응용 프로그램으로 작동하지만 서비스로 설치하는 방법을 알 수 없습니다. Visual Studio (Build, Publish)에서 프로젝트를 게시하고 관리자 권한으로 명령 프롬프트를 시작하고 애플리케이션이 게시 된 폴더로 이동 한 다음 명령 프롬프트에서 setup.exe -install을 실행합니다. 애플리케이션이 설치되고 실행되지만 Windows 서비스가 아닌 콘솔 애플리케이션으로 실행됩니다. 내가 여기서 무엇을 놓치고 있습니까?

Topshelf에 익숙하지 않은 사용자를 위해 .Net 용 Windows 서비스 프레임 워크이며 위에서 설명한 시나리오 (콘솔 애플리케이션으로 개발 및 디버그, Windows 서비스로 배포)를 용이하게합니다. http://docs.topshelf-project.com/en/latest/index.html 의 설명서를 참조하십시오 .


service.exe install서비스를 설치하려면 실행하십시오 .

자세한 내용은 Topshelf 명령 줄 참조 문서를 참조하십시오.


  1. Visual Studio를 시작하고 새 C # 콘솔 응용 프로그램을 만듭니다.
  2. 참조를 마우스 오른쪽 버튼으로 클릭하고 NuGet-Packages 관리로 이동하십시오.
  3. NuGet을 통해 Topshelf 다운로드 및 설치
  4. 아래 코드를 애플리케이션에 붙여넣고 모든 가져 오기를 포함하세요.
  5. "디버그"모드에서 "릴리스"로 전환하고 애플리케이션을 빌드합니다.
  6. cmd.exe관리자 권한 으로 실행
  7. 콘솔을 탐색하여

    .\myConsoleApplication\bin\Release\
    
  8. 명령 실행

    .\myConsoleApplication.exe install
    
  9. 명령 실행

    .\myConsoleApplication.exe start
    

암호:

using System;
using System.Threading;
using Topshelf;
using Topshelf.Runtime;

namespace MyConsoleApplication
{
    public class MyService
    {
        public MyService(HostSettings settings)
        {
        }

        private SemaphoreSlim _semaphoreToRequestStop;
        private Thread _thread;

        public void Start()
        {
            _semaphoreToRequestStop = new SemaphoreSlim(0);
            _thread = new Thread(DoWork);
            _thread.Start();
        }

        public void Stop()
        {
            _semaphoreToRequestStop.Release();
            _thread.Join();
        }

        private void DoWork()
        {
            while (true)
            {
                Console.WriteLine("doing work..");
                if (_semaphoreToRequestStop.Wait(500))
                {
                    Console.WriteLine("Stopped");
                    break;
                }
            }
        }
    }

    public class Program
    {
        public static void Main()
        {

            HostFactory.Run(x =>                                 
            {
                x.StartAutomatically(); // Start the service automatically

                x.EnableServiceRecovery(rc =>
                {
                    rc.RestartService(1); // restart the service after 1 minute
                });


                x.Service<MyService>(s =>
                {
                    s.ConstructUsing(hostSettings => new MyService(hostSettings));
                    s.WhenStarted(tc => tc.Start());             
                    s.WhenStopped(tc => tc.Stop());               
                });
                x.RunAsLocalSystem();                            

                x.SetDescription("MyDescription");        
                x.SetDisplayName("MyDisplayName");                       
                x.SetServiceName("MyServiceName");    

            });                                                 
        }
    }
}

폴더를 찾아 다음 명령을 실행하십시오.

AppName.exe install

관리자로 명령 프롬프트를 실행해야합니다.


그래서 이것은 오래된 질문이지만 몇 가지 명령 줄 옵션을 추가하고 싶습니다.

MyTopShelfImplementation.exe install -servicename "MyServiceName"-displayname "My Display Name"--autostart start

.

-자동 시작

Windows가 재부팅 될 때입니다.

스타트

설치 후 즉시 서비스를 시작하기위한 것입니다.

이제 코드에서 지정할 수도있는 "이름"

            HostFactory.Run(x =>
            {
                ////x.SetDescription("My Description");
                x.SetDisplayName("My Display Name");
                x.SetServiceName("My Service Name");
                ////x.SetInstanceName("My Instance");

따라서 .exe가 콘솔 앱 (또는 Windows 서비스)으로 실행되는 경우 코드에서 이러한 값을 설정하거나 명령 줄을 통해 전달하는 조합 일 수 있습니다.

코드에서 "이름"을 설정하지 않았고 명령 줄 인수로 "이름"을 전달하지 않은 경우 콘솔 동작이 발생합니다.

참고URL : https://stackoverflow.com/questions/18206738/installing-a-topshelf-application-as-a-windows-service

반응형