2011-01-04 33 views
5

Tôi đã xây dựng một dịch vụ Windows, bây giờ tôi muốn nó tự động cập nhật. Tôi đã đọc về việc tạo ra một dịch vụ thứ hai để làm điều đó hoặc chương trình khác nhau, không thể sử dụng bấm vào một, những gì về myBuild? Có ai biết không? cách tốt nhất là gì? Tôi có thể thay đổi hội đồng không?Cập nhật âm thầm một dịch vụ Windows

Trả lời

5

Nếu bạn muốn dịch vụ của bạn để chạy trong khi bạn đang thực hiện một bản cập nhật, đây là những gì tôi đã làm trước đây để đạt được điều này:

  1. Đặt Logic updateble của bạn thành một DLL riêng biệt.
  2. Tạo một AppDomain trong dịch vụ của bạn.
  3. Tạo màn hình tập tin kích hoạt sự kiện bất cứ khi nào bạn sao chép tập tin đó (bạn có thể sử dụng MSFT Ent Lib cập nhật)
  4. Dỡ bỏ dll cũ trong khi chặn (hàng đợi) các chủ đề mà thực thi công cụ từ dll mà
  5. tải trong tệp dll mới vào miền ứng dụng.
  6. Để chủ đề của bạn biết tiếp tục xử lý.
3
  1. Tải xuống exe mới và bất kỳ hội đồng bổ sung nào.
  2. Đổi tên nhóm lắp ráp hiện tại của bạn.
  3. Sao chép trong hội đồng mới của bạn.
  4. Khởi động lại dịch vụ. Bạn có thể xây dựng các chức năng khởi động lại dịch vụ vào exe dịch vụ chính của bạn.
  5. Khi dịch vụ bắt đầu kiểm tra các tệp được đổi tên từ bước 2 và xóa chúng để làm sạch.

Để khởi động lại dịch vụ của bạn làm

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

Sau đó, trong dịch vụ của bạn làm

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

Bạn có thể sửa đổi dịch vụ Windows của bạn để nó chỉ đơn giản là một Á hậu cho các ứng dụng chính của bạn, và có chức năng cập nhật ứng dụng chính của bạn.

Vì vậy, bạn sẽ có:

  • Service.exe: Chạy Application.exe, giám sát vị trí xa các bản cập nhật để Application.exe. Gửi sự kiện bắt đầu/dừng tới Application.exe

  • Application.exe: Điều gì đã từng là Service.exe của bạn. Nhận các sự kiện khởi động/dừng.

+0

... xin lỗi, có thể không được giải thích một cách khủng khiếp. Viết câu trả lời SO lúc 3 giờ sáng có lẽ không phải là ý tưởng hay nhất;) –

Các vấn đề liên quan