2011-10-23 2 views
1

Я создаю приложение службы Windows в Visual Studio 2010 Ultimate SP1.Как отлаживать приложения Windows Service Applications?

Я следовал «Как» из MSDN: http://msdn.microsoft.com/en-us/library/7a50syb3.aspx

я столкнулся с двумя проблемами:

  1. Я не могу запустить службу с помощью Server Explorer - моя служба в списке, но в в контекстном меню у меня есть только два доступных варианта: Refresh и Properties. Нет «Start», хотя в документации MSDN говорится, что такой параметр должен быть. К счастью, я могу избежать этой проблемы, используя диспетчер управления службами.

  2. Следующий шаг: «В Visual Studio выберите« Процессы из меню «Отладка» ». Этот параметр не существует в меню отладки. У меня есть только «Attach to Process», но службы там не указаны.

Кто-нибудь знает, что не так, и как я должен отлаживать свое приложение?

Заранее спасибо.

+0

http://stackoverflow.com/questions/125964/easier-way-to-start-debugging-a-windows-service-in-c-sharp –

ответ

2

Как мысль: я создал много служб Windows и по одной из многих причин я не создаю основной код в самой службе. Служба - это, по сути, «рабочий уровень», если хотите. Создание базового кода в dll позволяет отлаживать и тестировать этот конкретный код. Вы можете создать консольное или настольное приложение, которое будет запускать основной код, который можно использовать на этапах разработки и тестирования.

Лично я создал приложение сервис-бегун, которое фиксирует ведение журнала в сочетании с функциями запуска и остановки. Блоки кода OnStart и OnStop буквально идентичны кодам блока OnStart и OnStop.

Далее, при тестировании службы вы должны иметь возможность запустить службу (например, myService.exe) и подключиться к процессу. Тем не менее, еще одна заметка заключается в том, что вы должны приостановить/подождать поток службы (например, 30 секунд) с помощью сборки отладки, чтобы у вас было время для присоединения к процессу, и вы не пропустите свой код инициализации. Просто помните, что вам нужно установить свою службу, а затем запустить через диспетчер служб Windows.

Вот код, который может указать вам в том направлении, которое я использую. В файле service.cs службы я использую ниже; затем в методе Service OnStart() вы вызываете свою DLL и запускаете. Кроме того, вы можете остановить свою службу, заменить DLL на обновленную версию, а затем перезагрузить. С C# вы также можете заменить службу exe, но это только характеристики C#: на C++ вы не можете.

static class Program 
{ 
    public const string SERVICE_NAME = "myService"; 
    public const string SERVICE_DISPLAY_NAME = "My Service"; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main(string[] args) 
    { 
     if (args != null && args.Length > 0) 
     { 
      foreach (string arg in args) 
      { 
       switch (arg.ToLower()) 
       { 
        case "-install": 
         ManageService(true); 
         return; 

        case "-remove": 
         ManageService(false); 
         return; 
       } 
      } 


     } 

     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
       { 
        new Service() 
       }; 
     ServiceBase.Run(ServicesToRun); 
    } 

    private static void ManageService(bool bInstall) 
    { 
     string parms; 

     if (bInstall == true) 
     { 
      parms = string.Format("Create {0} type= own start= demand binPath= \"{1}\" DisplayName= \"{2}\"", SERVICE_NAME, 
            System.Reflection.Assembly.GetExecutingAssembly().Location, SERVICE_DISPLAY_NAME); 
     } 
     else // remove 
     { 
      parms = string.Format("Delete {0}", SERVICE_NAME); 
     } 

     try 
     { 
      string output = string.Empty; 
      System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("sc.exe", parms); 

      startInfo.UseShellExecute = false; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.RedirectStandardError = true; 
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
      startInfo.CreateNoWindow = true; 

      proc.StartInfo = startInfo; 

      proc.Start(); 

      output = proc.StandardOutput.ReadToEnd(); 

      proc.WaitForExit(10000); 

      if (proc.HasExited == true) 
      { 
       // NOTE: The project type has been changed from Windows Service to Console Application 
       // so that Console.WriteLine will output to the console 
       Console.WriteLine(output); 
      } 
      else 
      { 
       proc.Close(); 
       Console.WriteLine("Timed out waiting to install service"); 
      } 
     } 
     catch (System.ComponentModel.Win32Exception) 
     { 
      Console.WriteLine("Unable to locate sc.exe"); 
     } 
    } 
} 
0
//From the main function a method from service class can be called like below code 


//DebugApp method can be called from main and so the service can be debug: 
//Service class  
public partial class CServices : ServiceBase 
{ 
    public CServices() 
    { 
     InitializeComponent(); 
    } 

    **public void DebugApp() 
    { 
     OnStart(new string[]{}); 
    }** 
    protected override void OnStart(string[] args) 
    { 
     System.Console.WriteLine("Testing"); 
     System.Console.Read(); 
    } 

    protected override void OnStop() 
    { 
    } 
} 


//Calling from main: 

    static void Main() 
    { 
     Services1.CServices uc = new CServices(); 
     uc.DebugApp(); 
    } 
Смежные вопросы