如何從Visual Studio運行Windows服務項目。如何從Visual Studio運行(F5)Windows服務
我在Visual Studio 2008中構建了windows服務,我必須總是從控制面板運行服務,然後將調試器附加到服務的運行實例。它的煩人,因爲我正在清理很多代碼,並需要在開發過程中多次重新啓動我的服務。
我想設置我的項目,以便能夠擊中F5並運行服務並直接進入調試模式。關於如何實現這一點的一些提示會很棒。
在此先感謝!
如何從Visual Studio運行Windows服務項目。如何從Visual Studio運行(F5)Windows服務
我在Visual Studio 2008中構建了windows服務,我必須總是從控制面板運行服務,然後將調試器附加到服務的運行實例。它的煩人,因爲我正在清理很多代碼,並需要在開發過程中多次重新啓動我的服務。
我想設置我的項目,以便能夠擊中F5並運行服務並直接進入調試模式。關於如何實現這一點的一些提示會很棒。
在此先感謝!
在你的Main()
例行檢查Debugger.IsAttached
,如果它是真的啓動你的應用程序,如果它是一個控制檯,如果不是,請撥打ServiceBase.Run()
。
創建一個僅引用服務項目並實例化並啓動服務的獨立項目。它只是像一個普通的應用程序運行,你可以進入它。
YourService s = new YourService();
s.Start();
複製自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的現有實例或啓動新的實例。這實際上是我用來調試我的服務的機制。
該鏈接上的說明適用於我。謝謝! – 2011-06-20 22:21:23
僅供參考,在Windows 8中,似乎他們已經對Windows服務進行了一些更改,並削減了很多交互事物的能力。 Debugger.Launch()和Debugger.Break()似乎不再觸發GUI對話框,它允許您選擇和IDE進行調試,因此服務只是掛起。 FYI – 2012-11-23 12:35:33
單從服務構造函數調用的OnStart()事件
我做到了以下列方式
public XXX()
{
InitializeComponent();
OnStart(new string[] { "shafi", "moshy" });
}
您希望您的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");
}
}
}
這些鏈接在處理服務時非常有用。
這是散步,雖然創造他們 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
它爲您提供了快速入門所需的所有基礎知識。最重要的是,它爲您提供了一種非常好的方式來調試您的服務,就像它是一個常規的控制檯應用程序一樣。我還可以提到它提供了開箱即用的功能來安裝(和卸載)您的服務。這篇文章的第二部分可以在這個鏈接中找到。
我已經使用過自己幾次,並且可以真正推薦它。
可以將配套項目設置爲作爲控制檯應用程序運行的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
}
}
}
你也可以這樣做:(解釋見註釋)
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();
}
}
看這篇文章的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