2011-01-04 10 views
5

私はWindowsサービスを構築しましたが、今は自動更新します。私はそれを行うための第二のサービスを作成するか、または別のプログラムを読むことを読んだことがありますか?クリックしてください、myBuildについては何ですか?誰もそれを知っていますか?最善の方法は何ですか?アセンブリを変更できますか?Windowsサービスをサイレントに更新する

答えて

5

あなたがアップデートを実行している間、あなたのサービスを実行したい場合は、ここではこれを達成するために前に私が行っていたものです:

  1. 別のDLLにあなたのupdatebleロジックを入れてください。
  2. サービス内にAppDomainを作成します。
  3. あなたがそのDLLからのものを実行するスレッド
  4. ロード(キュー)をブロックしながらファイル(あなたがMSFT耳鼻咽喉科Libのアップデートを使用することができます)
  5. が古いDLLをアンロードすることをコピーしたときにイベントが発生したファイルモニタを作成します。新しいDLLファイルをアプリケーションドメインに追加します。
  6. 処理を続行するようスレッドに知らせます。
3
  1. 新しいexeと追加のアセンブリをダウンロードします。
  2. 既存のアセンブリの名前を変更します。
  3. 新しいアセンブリをコピーします。
  4. 再起動サービス。サービスの再起動機能をメインサービスのexeファイルに組み込むことができます。
  5. サービスが開始されると、手順2で名前を変更したファイルをチェックし、それらを削除してクリーンアップします。

private const string _mutexId = "MyUniqueId"; 
    private static Mutex _mutex; 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() 
    { 
     try 
     { 
      bool alreadyRunning = false; 
      try 
      { 
       Mutex.OpenExisting(_mutexId); 
       alreadyRunning = true; 
      } 
      catch (WaitHandleCannotBeOpenedException) 
      { 
       alreadyRunning = false; 
      } 
      catch 
      { 
       alreadyRunning = true;     
      } 
      if (alreadyRunning) 
      { 
       using (ServiceController sc = new ServiceController("MyServiceName")) 
       { 
        sc.Stop(); 
        sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 120)); 
        sc.Start(); 
       } 
       return; 
      } 
     } 
     catch 
     { 
     } 
     _mutex = new Mutex(true, _mutexId); 

     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new MyService() 
     }; 
     // Load the service into memory. 
     ServiceBase.Run(ServicesToRun); 
     _mutex.Close(); 
    } 
1

を行うそれは単にあなたのメインアプリケーションのためのランナーである、と持つように

System.Diagnostics.Process.Start 
    (System.Reflection.Assembly.GetEntryAssembly().Location) 

は、その後、あなたのサービスであなたのWindowsサービスを変更することができないあなたのサービスを再起動するにはメインアプリケーションを更新する機能

だから、あなたが持っているでしょう:

  • SERVICE.EXEは:Application.exeを実行し、Application.exeへの更新のための遠隔地を監視します。 Start/StopイベントをApplication.exeに送信します。

  • Application.exe:以前はService.exeでした。開始/停止イベントを受信します。

+0

...申し訳ありませんが、ひどくうまく説明されていません。午前3時にSOの回答を書くことはおそらく最良の考えではありません;) –

関連する問題