#region
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using CSFrameworkV5.Common;
using CSFrameworkV5.Core;
#endregion
namespace CSFrameworkV5.Library.CommonClass
{
///
/// 版本检测工具类, LAST UPDATE:20211212
///
public class VersionCheckNEW
{
//等待升级程序安全退出时间,单位毫秒。
private const int WAIT_SECONDS = 3000;
//系统常量定义 - 不可更改
private const string
Arg_CheckVersion = "CheckVersion"; // 主程序调用升级程序检查是否有版本更新
private const string Arg_MainEXECall = "MainEXECall"; // 主程序调用升级程序
private const string UpgraderINIFile = "UpgraderClient.ini"; //本地升级配置文件
private const string
UpgraderServerINIFile = "UpgraderServer.ini"; //服务端配置文件
//==========================================================================================
//重要变量定义!!!!!
//主程序文件名。主程序调用升级程序,必须修改此名称!
private const string DEF_MAIN_PROGRAM_NAME = "CSFrameworkV5.Main.exe";
//CSFramework商业版升级程序文件名
private const string DEF_UPGRADER_NAME = "CSFramework.AutoUpgrader.exe";
//CSFramework商业版升级程序 - 控制类的名字空间
private const string DEF_UPGRADER_CONTROLLER =
"CSFramework.AutoUpgrader.UpgraderController";
//V5.0标配升级程序文件名
//const string DEF_UPGRADER_NAME = "CSFrameworkV5.AutoUpgrader.exe";
//V5.0标配升级程序控制类的名字空间
//const string DEF_UPGRADER_CONTROLLER = "CSFramework.AutoUpgrader.Library.UpgraderController";
//
//==========================================================================================
///
/// 自动升级
///
public static void AutoUpgrader(ref bool exitApp)
{
var file = Application.StartupPath + @"\" + DEF_UPGRADER_NAME;
//本地没有升级程序文件,不进行自我升级, UpgraderClient.exe是通过DownloaderDB下载的
if (!File.Exists(file)) return;
frmWaitingEx.ShowMe(null, "正在获取最新的升级程序.......");
CheckUpgraderByDownloader();
frmWaitingEx.ShowMe(null, "正在获取升级包.......");
CheckVersion(ref exitApp);
}
///
/// 检查版本升级程序,有新版本自动下载
///
/// True:有新版本, False:无新版本
public static bool CheckUpgraderByDownloader()
{
var upgraderPath =
Application.StartupPath + @"\" + DEF_UPGRADER_NAME;
var serverVer = "";
try
{
//获取升级程序的程序集
var fileData = File.ReadAllBytes(upgraderPath);
var upgrader = Assembly.Load(fileData);
//通过.NET反射机制创建UpgraderController实例
var t = upgrader.GetType(DEF_UPGRADER_CONTROLLER);
var o = t.Assembly.CreateInstance(t.FullName);
var M = t.GetMethod("DownloadUpgrader");
//调用DownloadUpgrader方法
//参数名:destPath,传值:upgraderPath==Application.StartupPath
var r = M.Invoke(o, new object[] { upgraderPath });
serverVer = r.ToStringEx();
if (serverVer != "") //有新版本,保存配置文件
{
var ini = new IniFile(Application.StartupPath + @"\" +
UpgraderINIFile);
ini.IniWriteValue("Setup", "UpgraderFileVersion",
serverVer
.ToStringEx()); //写入版本号
}
}
catch (Exception ex)
{
LogUserOperate.Write(ex);
Msg.Warning("检查升级程序失败!\r\n" + ex.Message);
}
return serverVer != "";
}
///
/// 检查更新,有更新要退出主程序
///
/// 退出应用程序
public static void CheckVersion(ref bool AppExit)
{
AppExit = false;
try
{
var upgraderPath = Path.Combine(Application.StartupPath,
DEF_UPGRADER_NAME);
//获取升级程序的程序集
var fileData = File.ReadAllBytes(upgraderPath);
var upgrader = Assembly.Load(fileData);
//通过.NET反射机制创建UpgraderController实例
var t = upgrader.GetType(DEF_UPGRADER_CONTROLLER);
var o = t.Assembly.CreateInstance(t.FullName);
//获取升级包数量
var M = t.GetMethod("GetNewlyPackageCount");
var ret = M.Invoke(o, null);
var count = ConvertEx.ToInt(ret);
frmWaitingEx.HideMe();
if (count > 0) //有新版本,升级包的文件数>0
{
AppExit = true;
//启动通用升级程序(商业版)。程序参数:MainEXECall YourERP.exe
Process.Start(upgraderPath,
Arg_MainEXECall + " " + DEF_MAIN_PROGRAM_NAME);
}
}
catch (Exception ex)
{
LogUserOperate.Write(ex);
Msg.ShowError("检查版本失败!CheckVersion:" + ex.Message);
}
}
///
/// 取本地升级程序的版本号
///
///
public static string GetUpgraderVersion()
{
var ini =
new IniFile(Application.StartupPath + @"\" + UpgraderINIFile);
var clientVer = ini.IniReadValue("Client", "UpgraderFileVersion");
return clientVer;
}
///
/// 保存升级程序版本号
///
/// 版本号
public static void SaveUpgraderVersion(string version)
{
var ini =
new IniFile(Application.StartupPath + @"\" + UpgraderINIFile);
ini.IniWriteValue("Client", "UpgraderFileVersion", version);
}
}
}