【Remoting】.Net remoting方法实现简单的在线升级(下篇:重启exe)

时间:2023-03-09 02:30:15
【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(, "正在更新");
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( * ); //做个延时,因为进程响应快慢问题,可能会导致报错如:拒绝访问...文件或者尚未找到该应用路径
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 - ] != 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("无法复制!");
}
}