2013-08-13 14 views
40

Visual Studio Express 2012'yi kullanarak, Topshelf (Sürüm 3.1.107.0) kullanarak bir konsol uygulaması oluşturdum. Uygulama bir konsol uygulaması olarak çalışır, ancak bir hizmet olarak nasıl yükleneceğini anlayamıyorum. Projeyi Visual Studio (Build, Publish) içinden yayımladım, bir komut istemini Yönetici olarak başlattım, uygulamanın yayınlandığı klasöre yönlendirdim ve setup.exe -install komut isteminden çalıştırın. Uygulama yüklü ve çalışır, ancak bir konsol uygulaması olarak, bir Windows hizmeti değil. Burada neyi özlüyorum? TopShelf aşina olmayabilir edenler için Bir Windows hizmeti olarak bir Topshelf uygulamasını yükleme

, bu Net için bir Windows Hizmet çerçeve ve yukarıda tarif senaryoyu kolaylaştırmak gerekiyordu - bir Windows Hizmeti olarak dağıtmak, bir konsol uygulaması olarak geliştirmek ve hata ayıklama. http://docs.topshelf-project.com/en/latest/index.html adresindeki belgelere bakın.

+8

'Windows hizmetini çalıştırılabilir dosyadan oluştur' sorusuna baktım. Topshelf ile ilgili olmadığı için benim sorum ile alakalı görünmüyor. –

+2

Evet, Topshelf'in yaptığı şey, ve evet, onların belgelerini araştırdım. –

+0

Peki, ne buldun? Görünüşe göre, özellikle de "Uygulama yüklenir ve çalışır, ancak bir konsol uygulaması, bir Windows hizmeti değil" _ belgelerini izleyerek sorun yaşarsınız. Windows 'Services MMC ek bileşeninde yüklü hizmet görüyor musunuz? – CodeCaster

cevap

56

Hizmeti yüklemek için service.exe install numaralı telefonu çalıştırın.

Daha fazla bilgi için Topshelf Command Line Reference belgelerine bakın.

+0

Teşekkür ederiz! Hatam, ben bin \ release klasöründe servicename.exe dosyasını yüklemiş olsaydı, uygulamayı yayımladığımda oluşturulan setup.exe'yi yüklemeye çalışıyordum! Doh! Şimdi çalışıyor. –

24
  1. başlatın Visual Studio ve yeni bir C# konsol-Uygulama referanslara
  2. sağ tıklayın oluşturmak ve go Nuget-Paketleri
  3. İndir yönetmek ve uygulamaya aşağıda Kodu yapıştırın
  4. Nuget
  5. aracılığıyla Topshelf yüklemeye ve tüm ithalatı içerir.
  6. “Debug” modundan “Release” seçeneğine geçin ve uygulamayı oluşturun. Yönetici olarak
  7. Run cmd.exe
  8. gidin konsol Run

    .\myConsoleApplication\bin\Release\ 
    
  9. için komut

    .\myConsoleApplication.exe install 
    
  10. Çalıştır komutunu

    .\myConsoleApplication.exe start 
    

Kodu:

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

klasörüne atın ve komutu çalıştırın:

AppName.exe install 

Bir Yöneticisi olarak komut istemi çalıştırmalısınız.

+0

3 yıl geç .... hiçbir ekstra değer eklemiyor –

0

Bu eski bir sorudur, ancak bazı komut satırı seçenekleri eklemek istiyorum.

MyTopShelfImplementation.exe -servicename "MyServiceName" -displayname yüklemek "Benim Görüntü Adı"

başlamak --autostart. --autostart

pencereleri yeniden başlatıldığında içindir.

başlangıç ​​

sen Şimdi

yükledikten sonra HEMEN hizmeti başlamak içindir, "isimler" de

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

Yani eğer kod

içinde belirtebilirsiniz. exe, konsol uygulaması olarak (veya windows servisi olarak) bu değerleri kodda ayarlama ve/veya komut satırından geçirme gibi bazı kombinasyonlar olabilir.

Kodda "adlar" ayarlamamış olsaydınız VE komut satırı arşivlerinde "adlar" ı geçmediyseniz, konsol davranışı alırsınız.

İlgili konular