# UpdateTools **Repository Path**: Suendanny/UpdateTools ## Basic Information - **Project Name**: UpdateTools - **Description**: 我的万能更新器, 支持蓝奏云、github、gitee - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-29 - **Last Updated**: 2025-07-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 万能更新器 (Universal Updater) ## 项目简介 万能更新器是一个功能强大、灵活易用的自动更新工具,专为.NET应用程序设计。它支持多种更新源,包括标准HTTP服务器、GitHub、Gitee(码云)以及蓝奏云网盘,让您的应用程序能够轻松实现自动更新功能。 ## 主要特性 - **多种更新源支持**: - 标准HTTP服务器 - GitHub仓库 - Gitee(码云)仓库 - 蓝奏云网盘 - **丰富的更新功能**: - 版本检测与比较 - 自动下载更新包 - 解压并安装更新 - 自动重启应用程序 - 更新日志显示 - **灵活的配置选项**: - 静默更新模式 - 文件覆盖策略 - 文件占用处理 - 版本号提取模式自定义 - **用户友好界面**: - 进度显示 - 详细日志 - 更新日志展示 - 版本信息对比 - **高级功能**: - 程序集嵌入技术,避免DLL冲突 - 自动处理文件占用情况 - 命令行参数支持 - 首次运行自动创建配置文件 ## 系统要求 - .NET Framework 4.7.2 或更高版本 - Windows 7/8/10/11 ## 安装与使用 ### 基本使用步骤 1. **下载更新器**: - 从发布页面下载最新版本的更新器 2. **配置更新器**: - 首次运行时,更新器会自动创建`UpdateConfig.xml`配置文件 - 根据您的需求编辑该文件,配置更新服务器信息和应用程序设置 3. **集成到您的应用程序**: - 将更新器放置在您应用程序的安装目录或指定目录 - 在您的应用程序中添加调用更新器的代码 ### 配置文件说明 更新器使用`UpdateConfig.xml`文件进行配置,主要包括以下部分: ```xml LanZou https://your-lanzou-share-url.com 1234 false (.+)(\d+\.\d+\.\d+)\.zip . YourApplication.exe 1.0.0 Always Auto ``` ### 命令行参数 更新器支持以下命令行参数: ``` Update.exe [版本号] ``` - **版本号**:指定当前应用程序的版本号,格式为x.y.z(例如1.0.0)。如果不提供,更新器将尝试从配置文件或version.txt获取版本号。 ### 更新包格式 更新包应为ZIP格式,文件名需符合配置文件中指定的版本号提取模式。例如,如果版本号提取模式为`(.+)(\d+\.\d+\.\d+)\.zip`,则更新包文件名应类似于`YourApp-1.0.1.zip`。 ## 更新源配置详解 ### 标准HTTP服务器 ```xml http://example.com/updates/ true false ``` 服务器目录结构应为: ``` /updates/ ├── latest-version.txt # 包含最新版本号 ├── changelog.txt # 更新日志(可选) └── YourApp-1.0.1.zip # 更新包 ``` ### GitHub仓库 ```xml your-github-username your-repo-name your-access-token true main false ``` ### Gitee(码云)仓库 ```xml your-gitee-username your-repo-name your-access-token true master false ``` ### 蓝奏云网盘 ```xml https://suendanny.lanzouu.com/b0fpl27ri 5515 false (.+)(\d+\.\d+\.\d+)\.zip ``` #### 更新日志 ```bash 在蓝奏云的文件描述中 日志开始 这中间就是你的更新日志内容 日志结束 ``` ## 集成到您的应用程序 ### 重要提醒:版本一致性检查 **每次主程序启动时,必须检查并保持版本一致性:** 1. 主程序每次启动时,需要比较`UpdateConfig.xml`中的`LocalVersion`与主程序实际版本是否一致 2. 如果版本不一致,必须将`UpdateConfig.xml`中的`LocalVersion`修改为主程序的实际版本 3. 这一步骤非常重要,否则可能导致更新器无法正确检测是否有新版本可用 ```csharp // 版本一致性检查示例代码 private void CheckVersionConsistency() { try { // 获取当前应用程序版本 string appVersion = Application.ProductVersion; // 加载配置文件 XDocument configDoc = XDocument.Load("UpdateConfig.xml"); var localVersionElement = configDoc.Root.Element("Application")?.Element("LocalVersion"); if (localVersionElement != null) { string configVersion = localVersionElement.Value; // 检查版本是否一致 if (configVersion != appVersion) { // 更新配置文件中的版本号 localVersionElement.Value = appVersion; configDoc.Save("UpdateConfig.xml"); Console.WriteLine($"已更新配置文件中的版本号:{configVersion} -> {appVersion}"); } } } catch (Exception ex) { Console.WriteLine($"版本一致性检查失败: {ex.Message}"); } } ``` ### C#示例代码 ```csharp private void CheckForUpdates() { try { // 获取当前应用程序版本 string currentVersion = Application.ProductVersion; // 启动更新器,并传递当前版本号 ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "Update.exe", Arguments = currentVersion, UseShellExecute = true }; Process.Start(startInfo); } catch (Exception ex) { MessageBox.Show($"启动更新器失败: {ex.Message}", "更新错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } ``` ## 高级功能 ### 静默更新模式 在配置文件中设置`true`可启用静默更新模式。在此模式下: - 更新器将最小化运行,无需用户交互即可完成更新过程 - 检测到主程序正在运行时,将自动关闭主程序以确保更新顺利进行 - 更新完成后,自动重启主程序 - 整个过程对用户透明,提供流畅的用户体验 ```csharp // 静默更新模式下自动关闭主程序示例代码 private void CloseMainApplicationIfRunning(string exeName) { try { // 查找主程序进程 Process[] processes = Process.GetProcessesByName( Path.GetFileNameWithoutExtension(exeName)); if (processes.Length > 0) { // 记录日志 Console.WriteLine($"检测到主程序 {exeName} 正在运行,准备关闭..."); foreach (Process proc in processes) { // 尝试优雅关闭 - 发送关闭消息 if (!proc.HasExited) { proc.CloseMainWindow(); // 等待程序响应关闭请求 if (!proc.WaitForExit(3000)) { // 如果程序没有在3秒内关闭,强制结束进程 proc.Kill(); } Console.WriteLine("主程序已关闭,准备更新..."); } } } } catch (Exception ex) { Console.WriteLine($"关闭主程序时出错: {ex.Message}"); } } ``` ### 文件占用处理 更新器能够智能处理文件占用情况: - **Auto模式**:自动尝试结束占用文件的进程 - **Ask模式**:询问用户是否结束占用进程 - **Skip模式**:跳过被占用的文件 ### 版本号提取模式 使用正则表达式自定义版本号提取模式,以适应不同的文件命名规则。例如: - `(.+)(\d+\.\d+\.\d+)\.zip` 匹配 `YourApp-1.0.1.zip` - `(.+)(\d+\.\d+\.\d+)\.zip` 匹配 `YourAppv1.0.1.zip` ### 程序集嵌入技术 更新器使用程序集嵌入技术,将依赖项(如Newtonsoft.Json.dll)嵌入到主程序集中,避免与主应用程序的DLL产生冲突。 ## 常见问题解答 ### Q: 更新器无法获取服务器版本? A: 请检查网络连接和更新源配置。对于蓝奏云,确保分享链接和密码正确。 ### Q: 更新后主程序无法启动? A: 可能是更新包中的文件不完整或损坏。请确保更新包包含所有必要的文件。 ### Q: 如何在更新包中包含更新日志? A: 对于标准服务器,创建changelog.txt文件;对于蓝奏云,在分享页面的描述中使用`日志开始`和`日志结束`标记包围更新日志内容。 ### Q: 如何处理文件被占用的情况? A: 在配置文件中设置`FileInUseAction`选项。默认为`Auto`,会尝试自动结束占用进程。 ### Q: 为什么更新器无法检测到新版本? A: 请确保主程序的版本号与配置文件中的`LocalVersion`一致。每次主程序启动时,应当检查并更新配置文件中的版本号。 ## 技术细节 万能更新器基于.NET Framework 4.7.2开发,主要使用以下技术: - **异步编程**:使用`async/await`实现非阻塞操作 - **HTTP通信**:使用`HttpClient`和`WebClient`进行网络通信 - **ZIP处理**:使用`System.IO.Compression`进行压缩文件操作 - **XML配置**:使用`System.Xml.Linq`处理配置文件 - **程序集嵌入**:使用`ILMerge`和自定义程序集加载机制 ## 贡献与支持 欢迎提交问题报告、功能请求或代码贡献。如果您发现任何问题或有改进建议,请提交issue或pull request。 ## 许可证 本项目采用MIT许可证。详情请参阅LICENSE文件。 ## 致谢 感谢所有为本项目做出贡献的开发者和测试者。 --- *最后更新:2025年6月* *dotnet build Update/Update.csproj*