27

如何從Visual Studio運行Windows服務項目。如何從Visual Studio運行(F5)Windows服務

我在Visual Studio 2008中構建了windows服務,我必須總是從控制面板運行服務,然後將調試器附加到服務的運行實例。它的煩人,因爲我正在清理很多代碼,並需要在開發過程中多次重新啓動我的服務。

我想設置我的項目,以便能夠擊中F5並運行服務並直接進入調試模式。關於如何實現這一點的一些提示會很棒。

在此先感謝!

+0

看這篇文章的http:/ /msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx。它也指以下文章: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/en-us /library/ddhy0byf(v=vs.80).aspx – 2012-05-10 10:37:52

回答

6

在你的Main()例行檢查Debugger.IsAttached,如果它是真的啓動你的應用程序,如果它是一個控制檯,如果不是,請撥打ServiceBase.Run()

2

創建一個僅引用服務項目並實例化並啓動服務的獨立項目。它只是像一個普通的應用程序運行,你可以進入它。

YourService s = new YourService(); 
s.Start(); 
25

複製自here

static void Main(string[] args) 
{ 
    DemoService service = new DemoService(); 

    if (Environment.UserInteractive) 
    { 
     service.OnStart(args); 
     Console.WriteLine("Press any key to stop program"); 
     Console.Read(); 
     service.OnStop(); 
    } 
    else 
    { 
     ServiceBase.Run(service); 
    } 
} 

這應該允許您從Visual Studio中運行。

另一種方法是通過調用System.Diagnostics.Debugger.Break()在代碼中嵌入程序化斷點。當您將它放入服務的OnStart()回調並從服務控制檯啓動服務時,編程式斷點將觸發一個對話框,使您可以附加到Visual Studio的現有實例或啓動新的實例。這實際上是我用來調試我的服務的機制。

+3

該鏈接上的說明適用於我。謝謝! – 2011-06-20 22:21:23

+0

僅供參考,在Windows 8中,似乎他們已經對Windows服務進行了一些更改,並削減了很多交互事物的能力。 Debugger.Launch()和Debugger.Break()似乎不再觸發GUI對話框,它允許您選擇和IDE進行調試,因此服務只是掛起。 FYI – 2012-11-23 12:35:33

2

單從服務構造函數調用的OnStart()事件

我做到了以下列方式

public XXX() 
    { 
     InitializeComponent(); 
     OnStart(new string[] { "shafi", "moshy" }); 
    } 
0

您希望您的Windows服務作爲外殼,應該有很少的代碼所以你不必測試它。

你應該有你想讓你的服務在課堂上做的每件事。

你可以單元測試你的課程,如果它工作,然後將其引用到你的服務。

通過這種方式,當你有上課做你想做的每一件事,然後當它應用於你的服務時,每件事都應該起作用。 :)

請問事件日誌可以看到你的服務在運行時正在做什麼,也是一個很好的測試方法:D試試看。

namespace WindowsService 
{ 
    public partial class MyService : ServiceBase 
    { 
     public MyEmailService() 
     { 
      InitializeComponent(); 
      if (!System.Diagnostics.EventLog.SourceExists("MySource")) // Log every event 
      { 
       System.Diagnostics.EventLog.CreateEventSource(
        "MySource", "MyNewLog"); // Create event source can view in Server explorer 
      } 
      eventLogEmail.Source = "MySource"; 
      eventLogEmail.Log = "MyNewLog"; 

      clsRetriveEmail Emails = new clsRetriveEmail(); 
      eventLogEmail.WriteEntry("Populateing database with mail"); // log event 
      Emails.EmailGetList(); // Call class 
     } 
     protected override void OnStart(string[] args) 
     { 
      eventLogEmail.WriteEntry("Started"); 
     } 
     protected override void OnStop() 
     { 
      eventLogEmail.WriteEntry("Stopped"); 
     } 
     protected override void OnContinue() 
     {  
      eventLogEmail.WriteEntry("Continuing"); 
     } 
     } 
    } 
0

這些鏈接在處理服務時非常有用。

這是散步,雖然創造他們 http://msdn.microsoft.com/en-us/library/zt39148a.aspx

詹姆斯·邁克爾·黑爾在他的博客http://geekswithblogs.net/BlackRabbitCoder/寫了一個非常漂亮的模板/框架,他已經取得,使得它更容易發展(和調試)Windows服務:C#工具箱:可調試自安裝Windows服務模板(1 of 2)http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx

它爲您提供了快速入門所需的所有基礎知識。最重要的是,它爲您提供了一種非常好的方式來調試您的服務,就像它是一個常規的控制檯應用程序一樣。我還可以提到它提供了開箱即用的功能來安裝(和卸載)您的服務。這篇文章的第二部分可以在這個鏈接中找到。

我已經使用過自己幾次,並且可以真正推薦它。

3

可以將配套項目設置爲作爲控制檯應用程序運行的Windows服務,但使用反射訪問服務方法。有關詳細信息和示例,請參閱此處:http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/

下面是相關的代碼,你需要在控制檯應用程序:

using System; 
using System.Reflection; 

namespace TestableWindowsService 
{ 
    class TestProgram 
    { 
    static void Main() 
    { 
     Service1 service = new Service1(); 

     Type service1Type = typeof (Service1); 

     MethodInfo onStart = service1Type.GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Instance); //retrieve the OnStart method so it can be called from here 

     onStart.Invoke(service, new object[] {null}); //call the OnStart method 
    } 
    } 
} 
2

你也可以這樣做:(解釋見註釋)

public class Program : ServiceBase 
{ 
    private ServiceHost _serviceHost = null; 
    public Program() 
    { 
     ServiceName = ""; 
    } 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() 
    { 
       #if(!DEBUG) 
       // when deployed(built on release Configuration) to machine as windows service use this 
        ServiceBase[] ServicesToRun; 
        ServicesToRun = new ServiceBase[] { new Program() }; 
        ServiceBase.Run(ServicesToRun); 
       #else 
       // when debugging use this (When debugging after building in Debug Configuration) 
       //If you want the DEBUG preprocessor constant in Release you will have to check it on in the project configuration 
       Program progsvc = new Program(); 
       progsvc.OnStart(new string[] { }); 
       System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); 
       #endif       
    } 
    protected override void OnStart(string[] args) 
    { 
       // Start Web Service 
       if (_serviceHost != null) 
       { 
        _serviceHost.Close(); 
       } 
       _serviceHost = new ServiceHost(typeof(Namespace.Service)); 
       _serviceHost.Open(); 
    }  
} 
相關問題