2011-10-23 4 views
1

Visual Studio 2010 Ultimate SP1でWindowsサービスアプリケーションを作成しています。Windowsサービスアプリケーションのデバッグ方法

私はMSDNから「どのように」は次られた

http://msdn.microsoft.com/en-us/library/7a50syb3.aspx

私は2つの問題に遭遇している:私は、サーバーエクスプローラを介してサービスを開始することはできません

  1. を - 私のサービスがそこに記載されていますが、中にコンテキストメニュー私は利用できる2つのオプションしか持っていない:リフレッシュとプロパティ。 MSDNのドキュメントにはそのオプションがあるはずだが、「スタート」はありません。 幸いにも、私はServices Control Managerを使用することでこの問題を回避できます。

  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サービスを構築しています。多くの理由の1つでは、サービス自体にコアコードを作成しません。サービスは本質的に「運用レイヤー」です。 DLLにコアコードを作成すると、その特定のコードのデバッグとテストが可能になります。開発段階とテスト段階で使用できるコアコードを実行するコンソールまたはデスクトップアプリケーションを作成できます。

個人的には、開始と停止の機能と一緒にログインをキャプチャするサービスランナーアプリケーションを作成しました。私のOnStartとOnStopのコードブロックは、文字通りサービスと同じです。

次に、サービスをテストすると、サービス(myService.exeなど)を開始してプロセスにアタッチできるはずです。ただし、デバッグビルドを使用してサービススレッドを一時停止または待機(たとえば30秒)する必要があるため、プロセスにアタッチする時間があり、初期化コードを忘れないようにする必要があります。ちょっと覚えておいてください。サービスをインストールしてから、Windowsのサービスマネージャーから起動する必要があります。

ここで私が使用する方向にあなたを指し示すかもしれないコードがあります。 service.csファイルのサービスでは、私は以下を使用します。サービスの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(); 
    } 
関連する問題