zoukankan      html  css  js  c++  java
  • 【Remoting】.Net remoting方法实现简单的在线升级(下篇:重启exe)

    一、前言

         上篇运用了.Net Remoting技术解决了本地与服务器版本对比,并下载更新包的过程。

          本篇主要是应用Process,来实现重启程序的过程。

          情景假设:

          Revit2016正加载某dll,其版本为1.0.0.0。服务器的更新dll版本为1.0.0.10。

          下载完后,Revit2016关闭,旧dll删除,新dll复制到旧dll的所在路径,重启Revit2016。

    二、代码

          在上篇最后一段代码的79—80行之前插入如下代码:

                    bgk_Update.ReportProgress(100, "正在更新");              
                    Thread t = new Thread(new ThreadStart(Update));
                    t.Start();

           执行Update函数:

            public void Update()
            {
                string exepath = string.Empty;
                Process[] ps = Process.GetProcessesByName("Revit");
                foreach (Process p in ps)
                {
                    exepath = p.MainModule.FileName.ToString();  //获得该进程的exe路径
                    p.Kill();                                    //关闭该进程
                }
                foreach (var module in serverupdatefiles.Keys)  //删除原有的module
                {
                    System.Threading.Thread.Sleep(1 * 1000);    //做个延时,因为进程响应快慢问题,可能会导致报错如:拒绝访问...文件或者尚未找到该应用路径
                    System.IO.File.Delete(Path.Combine(Config.Dir, module + ".dll")); //将新文件复制到旧文件的文件夹内
                }
                CopyDir(Config.TempDir, Config.Dir);
    
                System.Diagnostics.Process.Start(exepath);//重启该exe
            }

             复制某文件夹的内容到另一个文件夹内:

    public static void CopyDir(string srcPath, string aimPath)
            {
                try
                {
                    // 检查目标目录是否以目录分割字符结束如果不是则添加之
                    if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar)
                        aimPath += Path.DirectorySeparatorChar;
                    // 判断目标目录是否存在如果不存在则新建之
                    if (!Directory.Exists(aimPath))
                        Directory.CreateDirectory(aimPath);
                    // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组
                    // 如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法
                    string[] fileList = Directory.GetFiles(srcPath);
                   // string[] fileList = Directory.GetFileSystemEntries(srcPath);
                    // 遍历所有的文件和目录
                    foreach (string file in fileList)
                    {
                        // 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
                        if (Directory.Exists(file))
                            CopyDir(file, aimPath + Path.GetFileName(file));
                        // 否则直接Copy文件
                        else
                            File.Copy(file, aimPath + Path.GetFileName(file), true);
                    }
                }
                catch
                {
                    Console.WriteLine("无法复制!");
                }
            }

             

  • 相关阅读:
    HTTPClient学习
    mysql数据库的完全卸载方法
    对JQuery中Ajax应用与jQuery插件的理解与笔记
    excel 的COUNTIF函数
    转:jquery validate 的自定义验证开始时间不能大于结束时间
    jQuery Validate验证框架详解
    转:Excel:Excel中对特殊字符的转义和处理
    转:IE 弹出提示:由于无法验证发布者,所以Windows 已经阻止此软件
    沙漠玫瑰眼影搭配2
    sql查所有表名
  • 原文地址:https://www.cnblogs.com/lovecsharp094/p/5618447.html
Copyright © 2011-2022 走看看