2013-08-13 4 views
40

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

Topshelf에 익숙하지 않은 사용자를 위해 .Net 용 Windows 서비스 프레임 워크이며 위에서 설명한 시나리오를 쉽게 수행 할 수 있습니다. 콘솔 응용 프로그램으로 개발 및 디버깅하고 Windows 서비스로 배포하십시오. http://docs.topshelf-project.com/en/latest/index.html의 설명서를 참조하십시오.

+8

'실행 가능한 Windows 서비스 만들기'질문을 보았습니다. Topshelf에 관한 것이 아니기 때문에 내 질문과 관련이없는 것 같습니다. –

+2

예, 이것이 Topshelf가하는 것입니다. 그렇습니다. 나는 그들의 문서를 조사했습니다. –

+0

그럼 뭘 찾았습니까? 외관상으로는 당신은 특히 "응용 프로그램이 설치되어 실행되지만 콘솔 응용 프로그램이 아닌 Windows 서비스"_에서 문서를 읽는 데 어려움이있는 것 같습니다. Windows의 서비스 MMC 스냅인에 서비스가 설치되어 있습니까? – CodeCaster

답변

56

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

자세한 내용은 Topshelf Command Line Reference 설명서를 참조하십시오.

+0

고마워요! 내 실수는 bin \ release 폴더에 servicename.exe 파일을 설치해야 할 때 응용 프로그램을 게시 할 때 만든 setup.exe를 설치하려고 시도했기 때문입니다! 도! 모두 일하고있어. –

24
  1. 시작 Visual Studio 및 새로운 C# 콘솔 응용 프로그램 참조에
  2. 오른쪽 클릭을 생성하고 이동 NuGet-패키지를
  3. 다운로드를 관리하고 응용 프로그램에 다음 코드를 붙여 넣습니다
  4. NuGet
  5. 을 통해 Topshelf 설치 모든 수입품을 포함합니다.
  6. "디버그"모드에서 "릴리스"로 전환하고 응용 프로그램을 빌드하십시오. 관리자로
  7. 실행 cmd.exe
  8. 이동 콘솔 실행

    .\myConsoleApplication\bin\Release\ 
    
  9. 에 명령

    .\myConsoleApplication.exe install 
    
  10. 명령을 실행

    .\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");  

      });             
     } 
    } 
} 
7

폴더를 찾아 명령을 실행 :

AppName.exe install 

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

+0

3 년 늦게 .... 부가 가치 없음 –

0

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

MyTopShelfImplementation.exe이 -servicename "MyServiceName" -DisplayName를 설치 "내 표시 이름"

을 시작 --autostart. --autostart

윈도우 재부팅 할 때입니다.

시작

당신이 지금

를 설치 한 후 즉시 서비스를 시작하는 것입니다은 "이름은"당신은 또한

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

그래서 만약 코드

에 지정할 수 있습니다. exe는 콘솔 앱 (또는 Windows 서비스)으로 실행되며 코드에서 이러한 값을 설정하거나 명령 줄을 통해 전달할 수 있습니다.

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

관련 문제