C#实现的自动升级系统

C#实现的自动升级系统,包含服务端和客户端实现,支持版本检测、差分更新和静默安装功能:


一、服务端实现(ASP.NET Core Web API)

1. 版本检测接口
csharp 复制代码
[ApiController]
[Route("api/[controller]")]
public class UpdateController : ControllerBase
{
    private readonly IUpdateService _updateService;

    public UpdateController(IUpdateService updateService)
    {
        _updateService = updateService;
    }

    [HttpGet("check")]
    public IActionResult CheckUpdate(string currentVersion)
    {
        var updateInfo = _updateService.GetUpdateInfo(currentVersion);
        return Ok(updateInfo);
    }

    [HttpGet("download")]
    public IActionResult DownloadUpdate(string version)
    {
        var fileStream = _updateService.GetUpdatePackage(version);
        return File(fileStream, "application/octet-stream", $"Update_{version}.zip");
    }
}
2. 更新服务实现
csharp 复制代码
public class UpdateService : IUpdateService
{
    private readonly IConfiguration _config;
    private readonly IDatabaseService _dbService;

    public UpdateService(IConfiguration config, IDatabaseService dbService)
    {
        _config = config;
        _dbService = dbService;
    }

    public UpdateInfo GetUpdateInfo(string currentVersion)
    {
        var latestVersion = _dbService.GetLatestVersion();
        return new UpdateInfo
        {
            CurrentVersion = currentVersion,
            LatestVersion = latestVersion,
            NeedUpdate = !string.IsNullOrEmpty(latestVersion) && 
                         new Version(currentVersion) < new Version(latestVersion),
            DownloadUrl = $"{_config["UpdateBaseUrl"]}/download?version={latestVersion}"
        };
    }

    public Stream GetUpdatePackage(string version)
    {
        var packagePath = Path.Combine(_config["UpdatePath"], $"Update_{version}.zip");
        return File.OpenRead(packagePath);
    }
}

二、客户端实现(WinForm)

1. 自动更新核心类
csharp 复制代码
public class AutoUpdater
{
    private readonly string _updateUrl = "http://update.example.com/api/update";
    private readonly string _localVersionFile = "version.txt";
    
    public event EventHandler<UpdateProgressEventArgs> ProgressChanged;
    public event EventHandler<UpdateCompletedEventArgs> Completed;

    public async Task CheckForUpdates()
    {
        try
        {
            var response = await HttpClient.GetAsync($"{_updateUrl}/check?currentVersion={GetCurrentVersion()}");
            var updateInfo = JsonSerializer.Deserialize<UpdateInfo>(await response.Content.ReadAsStringAsync());

            if (updateInfo.NeedUpdate)
            {
                await DownloadUpdate(updateInfo.LatestVersion);
                await InstallUpdate();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"更新检查失败: {ex.Message}");
        }
    }

    private async Task DownloadUpdate(string version)
    {
        using var client = new WebClient();
        client.DownloadProgressChanged += (s, e) => 
            ProgressChanged?.Invoke(this, new UpdateProgressEventArgs(e.ProgressPercentage));
        
        await client.DownloadFileTaskAsync(
            $"{_updateUrl}/download?version={version}",
            Path.Combine(Application.StartupPath, $"Update_{version}.zip"));
    }

    private async Task InstallUpdate()
    {
        var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
        Directory.CreateDirectory(tempDir);

        ZipFile.ExtractToDirectory(
            Path.Combine(Application.StartupPath, $"Update_{GetCurrentVersion()}.zip"),
            tempDir);

        // 执行静默安装
        Process.Start(new ProcessStartInfo
        {
            FileName = Path.Combine(tempDir, "setup.exe"),
            Arguments = "/SILENT",
            UseShellExecute = false,
            CreateNoWindow = true
        }).WaitForExit();

        File.WriteAllText(_localVersionFile, GetCurrentVersion());
        Completed?.Invoke(this, new UpdateCompletedEventArgs(true));
    }

    private string GetCurrentVersion()
    {
        return File.Exists(_localVersionFile) 
            ? File.ReadAllText(_localVersionFile) 
            : "0.0.0.0";
    }
}

public class UpdateInfo
{
    public string CurrentVersion { get; set; }
    public string LatestVersion { get; set; }
    public bool NeedUpdate { get; set; }
    public string DownloadUrl { get; set; }
}

public class UpdateProgressEventArgs : EventArgs
{
    public int ProgressPercentage { get; }
    public UpdateProgressEventArgs(int percentage) => ProgressPercentage = percentage;
}

public class UpdateCompletedEventArgs : EventArgs
{
    public bool Success { get; }
    public UpdateCompletedEventArgs(bool success) => Success = success;
}

三. 关键功能实现

1. 差分更新(使用BSdiff算法)
csharp 复制代码
public class DifferentialUpdater
{
    public byte[] GeneratePatch(byte[] oldData, byte[] newData)
    {
        var patch = new Bsdiff();
        return patch.Generate(oldData, newData);
    }

    public byte[] ApplyPatch(byte[] oldData, byte[] patch)
    {
        var patcher = new Bsdiff();
        return patcher.Apply(oldData, patch);
    }
}
2. 文件校验
csharp 复制代码
public class FileValidator
{
    public bool VerifyChecksum(string filePath, string expectedHash)
    {
        using var sha256 = SHA256.Create();
        using var stream = File.OpenRead(filePath);
        var hash = sha256.ComputeHash(stream);
        return BitConverter.ToString(hash).Replace("-", "") == expectedHash;
    }
}

四、部署方案

1. 服务端配置(appsettings.json)
csharp 复制代码
{
  "UpdateBaseUrl": "https://update.example.com",
  "UpdatePath": "C:\\UpdatePackages",
  "Database": {
    "ConnectionString": "Server=localhost;Database=UpdateDB;Trusted_Connection=True;"
  }
}
2. 客户端配置(app.config)
csharp 复制代码
<configuration>
  <appSettings>
    <add key="UpdateCheckInterval" value="86400"/> <!-- 24小时检查一次 -->
    <add key="AutoInstall" value="true"/>
  </appSettings>
</configuration>

五、使用示例

csharp 复制代码
// 初始化更新器
var updater = new AutoUpdater();
updater.ProgressChanged += (s, e) => 
    progressBar1.Value = e.ProgressPercentage;
updater.Completed += (s, e) => 
    MessageBox.Show(e.Success ? "更新成功" : "更新失败");

// 启动更新检查
await updater.CheckForUpdates();

参考代码 C#自动升级实例源码 www.youwenfan.com/contentcso/93099.html

六、工程结构

复制代码
AutoUpdateSystem/
├── Services/            # 业务逻辑层
│   ├── UpdateService.cs
│   └── DifferentialUpdater.cs
├── Clients/             # 客户端实现
│   └── AutoUpdater.cs
├── Models/              # 数据模型
│   └── UpdateInfo.cs
├── Utils/               # 工具类
│   ├── FileValidator.cs
│   └── FileDownloader.cs
└── Tests/               # 单元测试
    └── UpdateServiceTests.cs
相关推荐
精神小伙就是猛6 小时前
C# Task/ThreadPool async/await对比Golang GMP
开发语言·golang·c#
济6176 小时前
linux(第十四期)--官方 SDK 移植实验-- Ubuntu20.04
linux·运维·服务器
工程师0076 小时前
C#状态机
开发语言·c#·状态模式·状态机
cngm1106 小时前
记录两个网卡同时访问两个网段的调试方法route print
服务器·网络·windows
杰克崔6 小时前
kprobe及kretprobe的基于例子来调试分析其原理
linux·运维·服务器·车载系统
开开心心_Every6 小时前
离线黑白照片上色工具:操作简单效果逼真
java·服务器·前端·学习·edge·c#·powerpoint
咕噜签名-铁蛋6 小时前
给服务器穿件“智能防弹衣“
服务器
Full Stack Developme6 小时前
达梦(DM8)基于 LBS(位置服务)教程
服务器·网络·数据库
捷米研发三部6 小时前
CC-LINK IE FB转CAN协议转换网关实现三菱PLC与仪表通讯在农业机械的应用案例
网络
小李独爱秋6 小时前
计算机网络经典问题透视:端到端时延和时延抖动有什么区别?
运维·服务器·计算机网络·安全·web安全