using AutoUpdaterDotNET; using Microsoft.Extensions.Configuration; using System.IO; using System.Net.Http; using System.Reflection; using System.Xml; namespace YY.Admin.Services.Service.AutoUpdate { public class AutoUpdateService : IAutoUpdateService { private readonly IConfiguration _configuration; private readonly HttpClient _httpClient; public AutoUpdateService(IConfiguration configuration, HttpClient httpClient) { _configuration = configuration; _httpClient = httpClient; } /// /// 获取当前程序版本 /// /// public string GetCurrentVersion() { try { var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly(); var version = assembly.GetName().Version; return version?.ToString() ?? "1.0.0.0"; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"获取当前版本失败: {ex.Message}"); return "1.0.0.0"; } } /// /// 获取程序版本信息(包含版本号、产品名称等) /// /// public VersionInfo GetApplicationInfo() { try { var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly(); var version = assembly.GetName().Version; var title = assembly.GetCustomAttribute()?.Title; var product = assembly.GetCustomAttribute()?.Product; var company = assembly.GetCustomAttribute()?.Company; return new VersionInfo { CurrentVersion = version?.ToString() ?? "1.0.0.0", ApplicationName = title ?? product ?? "应用程序", CompanyName = company ?? "", PublishDate = File.GetLastWriteTime(assembly.Location).ToString("yyyy-MM-dd") }; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"获取应用程序信息失败: {ex.Message}"); return new VersionInfo { CurrentVersion = "1.0.0.0", ApplicationName = "应用程序", CompanyName = "", PublishDate = DateTime.Now.ToString("yyyy-MM-dd") }; } } public async Task CheckForUpdatesAsync() { try { VersionInfo? versionInfo = await ReadRemoteVersionInfoAsync(); if (versionInfo == null) return false; var currentVersion = new Version(GetCurrentVersion()); var latestVersion = new Version(versionInfo.LatestVersion); return latestVersion > currentVersion; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"自动更新检查失败: {ex.Message}"); return false; } } public async Task GetVersionInfo() { try { VersionInfo? versionInfo = await ReadRemoteVersionInfoAsync(); if (versionInfo == null) return null; versionInfo.CurrentVersion = versionInfo.CurrentVersion; versionInfo.ApplicationName = versionInfo.ApplicationName; return versionInfo; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"获取版本信息失败: {ex.Message}"); return null; } } private async Task ReadRemoteVersionInfoAsync() { try { // 从配置文件读取远程更新地址 string remoteConfigUrl = _configuration.GetSection("AutoUpdate:RemoteConfigUrl").Value!; var xmlContent = await _httpClient.GetStringAsync(remoteConfigUrl); return ParseVersionXml(xmlContent); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"读取远程版本信息失败: {ex.Message}"); return null; } } private VersionInfo? ParseVersionXml(string xmlContent) { try { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlContent); var item = xmlDoc.SelectSingleNode("item"); if (item != null) { return new VersionInfo { LatestVersion = item.SelectSingleNode("version")?.InnerText ?? "1.0.0", DownloadUrl = item.SelectSingleNode("url")?.InnerText ?? "", Changelog = item.SelectSingleNode("changelog")?.InnerText ?? "暂无更新内容", PublishDate = item.SelectSingleNode("publishDate")?.InnerText ?? DateTime.Now.ToString("yyyy-MM-dd"), Mandatory = bool.TryParse(item.SelectSingleNode("mandatory")?.InnerText, out var mandatory) && mandatory }; } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"解析版本XML失败: {ex.Message}"); } return null; } public void StartUpdate(string downloadUrl) { try { // 设置更新完成后的回调 AutoUpdater.ApplicationExitEvent += () => { // 更新完成后可以执行一些清理操作 System.Diagnostics.Debug.WriteLine("应用程序准备退出以完成更新"); }; AutoUpdater.Start(downloadUrl); } catch (Exception ex) { throw new Exception($"更新启动失败: {ex.Message}"); } } // 检查是否需要强制更新 public bool IsMandatoryUpdate(VersionInfo versionInfo) { if (versionInfo == null) return false; var currentVersion = new Version(GetCurrentVersion()); var latestVersion = new Version(versionInfo.LatestVersion); return versionInfo.Mandatory && latestVersion > currentVersion; } } }