# 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*