27

Cách chạy dự án dịch vụ cửa sổ từ studio trực quan.cách chạy (F5) dịch vụ cửa sổ từ studio trực quan

Tôi đang xây dựng một cửa sổ serivce trong studio hình ảnh 2008, tôi phải luôn luôn chạy dịch vụ từ bảng điều khiển và sau đó đính kèm trình gỡ rối để chạy thể hiện của dịch vụ. Loại khó chịu của nó kể từ khi tôi làm sạch rất nhiều mã và cần phải khởi động lại dịch vụ của tôi nhiều lần trong quá trình phát triển.

Tôi muốn thiết lập dự án của mình để có thể nhấn F5 và chạy dịch vụ và trực tiếp vào chế độ gỡ lỗi. Một số lời khuyên về cách để đạt được điều này sẽ là tuyệt vời.

Cảm ơn trước !!!

+0

Nhìn bài viết này http://msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx. Nó cũng đề cập đến các bài viết sau: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/en-us /library/ddhy0byf(v=vs.80).aspx –

Trả lời

6

Trong Main() kiểm tra định kỳ Debugger.IsAttached và nếu ứng dụng đó thực sự khởi động ứng dụng của bạn như thể nó là một bảng điều khiển, nếu không, hãy gọi số ServiceBase.Run().

2

Tạo dự án riêng biệt chỉ tham chiếu đến dự án dịch vụ và khởi tạo và bắt đầu dịch vụ. Nó chỉ chạy như một ứng dụng bình thường và bạn có thể bước vào nó.

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

Sao chép từ 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); 
    } 
} 

Điều này sẽ cho phép bạn chạy từ trong Visual Studio.

Một cách khác là nhúng điểm ngắt có lập trình trong mã của bạn bằng cách gọi System.Diagnostics.Debugger.Break(). Khi bạn đặt lệnh này vào, gọi lại OnStart() của dịch vụ và bắt đầu dịch vụ của bạn từ bảng điều khiển Dịch vụ, điểm ngắt có lập trình sẽ kích hoạt hộp thoại cho phép bạn đính kèm vào một phiên bản hiện tại của Visual Studio hoặc để bắt đầu một phiên bản mới ví dụ. Đây thực sự là cơ chế tôi sử dụng để gỡ lỗi dịch vụ của mình.

+3

Các hướng dẫn tại liên kết đó hoạt động hoàn hảo cho tôi. Cảm ơn! –

+0

Chỉ cần FYI, trong Windows 8, có vẻ như họ đã thực hiện một số thay đổi đối với dịch vụ windows và cắt giảm rất nhiều về khả năng của họ để làm những việc tương tác. Debugger.Launch() và Debugger.Break() dường như không còn kích hoạt Hộp thoại GUI cho phép bạn chọn và IDE để gỡ lỗi để dịch vụ chỉ bị treo. FYI –

2

Chỉ cần gọi cho sự kiện OnStart() từ các nhà xây dựng dịch vụ

tôi đã làm nó theo cách sau

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

Bạn muốn có dịch vụ cửa sổ của bạn như một vỏ, cần có ít mã trong vì vậy bạn không cần phải kiểm tra nó.

Bạn nên có mọi thứ bạn muốn dịch vụ của mình thực hiện trong lớp học.

Bạn có thể kiểm tra đơn vị lớp học của bạn và nếu nó hoạt động thì hãy tham khảo nó với dịch vụ của bạn.

Bằng cách này, khi bạn có lớp học làm mọi thứ bạn muốn thì khi áp dụng cho dịch vụ của bạn, mọi thứ sẽ hoạt động. :)

Bản ghi sự kiện có thể xem dịch vụ của bạn đang hoạt động khi đang chạy hay không, cũng là một cách hay để kiểm tra: D hãy thử điều đó.

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

Các liên kết này có thể rất hữu ích khi làm việc với các dịch vụ.

Đây là một bước đi mặc dù vào việc tạo ra chúng http://msdn.microsoft.com/en-us/library/zt39148a.aspx

James Michael Hare đã trên blog của mình http://geekswithblogs.net/BlackRabbitCoder/ viết về một mẫu thật sự tốt đẹp/khuôn khổ ông đã thực hiện, làm cho nó dễ dàng hơn rất nhiều để phát triển (và debug) Các dịch vụ của Windows : C# Hộp công cụ: Mẫu bản ghi dịch vụ Windows có khả năng gỡ lỗi, tự cài đặt (1/2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx

Nó cung cấp cho bạn tất cả các khái niệm cơ bản bạn cần để bắt đầu nhanh chóng. Và tốt nhất, nó cung cấp cho bạn một cách thực sự tốt đẹp để gỡ lỗi dịch vụ của bạn như thể nó là một ứng dụng giao diện điều khiển thông thường. Tôi cũng có thể đề cập rằng nó cung cấp chức năng hộp để cài đặt (và gỡ cài đặt) dịch vụ của bạn. Phần hai của bài viết có thể được tìm thấy tại liên kết này.

Tôi đã sử dụng bản thân này một vài lần và thực sự có thể đề xuất.

3

Có thể thiết lập dự án đồng hành với Dịch vụ Windows chạy dưới dạng ứng dụng bảng điều khiển, nhưng truy cập các phương thức dịch vụ bằng cách sử dụng Phản chiếu. Xem ở đây để biết chi tiết và ví dụ: http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/.

Đây là mã có liên quan mà bạn sẽ cần trong giao diện điều khiển ứng dụng:

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

Bạn cũng có thể làm như sau: (Xem cảm nhận cho lời giải thích)

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(); 
    }  
} 
Các vấn đề liên quan