静默更新Windows服务

时间:2011-01-04 13:17:06

标签: c# .net windows-services auto-update

我已经构建了一个Windows服务,现在我希望它能够自动更新。我已经阅读了关于创建第二个服务来执行该操作或不同的程序,无法使用单击一个,myBuild怎么办?有谁知道吗?什么是最好的方法?我可以改变组件吗?

3 个答案:

答案 0 :(得分:5)

如果您希望在执行更新时运行服务,请执行以下操作:

  1. 将您的可更新逻辑放入单独的DLL中。
  2. 在您的服务中创建一个AppDomain。
  3. 创建文件监视器,每当您复制该文件时都会触发事件(您可以使用MSFT Ent Lib更新)
  4. 在阻止(排队)执行来自该dll的内容的线程时卸载旧的dll
  5. 将新dll文件加载到应用程序域中。
  6. 让你的线程知道继续处理。

答案 1 :(得分:3)

  1. 下载新的exe和任何其他程序集。
  2. 重命名现有的程序集。
  3. 复制新装配体。
  4. 重启服务。您可以在主服务exe中构建服务重启功能。
  5. 服务开始时,检查步骤2中重命名的文件并删除它们以进行清理。
  6. 要重新启动服务,请执行

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

    然后在你的服务中做

        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();
        }
    

答案 2 :(得分:1)

您可以修改Windows服务,使其成为主应用程序的运行器,并具有更新主应用程序的功能。

所以你会:

  • Service.exe:运行Application.exe,监视远程位置以获取Application.exe的更新。将启动/停止事件发送到Application.exe

  • Application.exe:以前是您的Service.exe。接收开始/停止事件。