如何用C#在下载前获取GitHub上exe文件的版本信息
无需下载exe即可获取GitHub上的文件版本信息方案
方法一:仓库中维护轻量版本元文件
这是最直接的方案,在exe同目录下新增一个极小的版本文件(如version.txt),每次更新exe时同步修改该文件的版本内容。代码先请求这个小文件拿到版本号,再和本地版本对比决定是否下载。
using System.Net; using System.IO; // 替换为你的版本文件GitHub raw地址 var versionFileUrl = $"https://raw.githubusercontent.com/{get-id}/AutoUpdate/main/version.txt"; var localExePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "hello.exe"); string remoteVersion = null; // 获取远程版本号 using (var wc = new WebClient()) { try { remoteVersion = wc.DownloadString(versionFileUrl).Trim(); } catch (WebException ex) { Console.WriteLine($"获取远程版本失败:{ex.Message}"); return; } } // 获取本地已安装exe的版本(如果存在) string localVersion = null; if (File.Exists(localExePath)) { var versionInfo = FileVersionInfo.GetVersionInfo(localExePath); localVersion = versionInfo.ProductVersion; } // 对比版本并执行下载逻辑 if (string.IsNullOrEmpty(localVersion) || !remoteVersion.Equals(localVersion, StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("发现新版本,开始下载..."); var exeUrl = $"https://raw.githubusercontent.com/{get-id}/AutoUpdate/main/hello.exe"; using (var wc = new WebClient()) { wc.DownloadFile(exeUrl, localExePath); } Console.WriteLine("下载完成"); } else { Console.WriteLine("当前已是最新版本"); }
方法二:利用GitHub Releases API
如果你的exe是通过GitHub Releases发布的,可调用官方API获取最新Release的版本号。注意公开仓库无认证请求有速率限制,私有仓库需携带访问令牌。
using System.Net; using System.Text.Json; // 替换为你的仓库API地址 var apiUrl = $"https://api.github.com/repos/{get-id}/AutoUpdate/releases/latest"; var localExePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "hello.exe"); string remoteVersion = null; using (var wc = new WebClient()) { // GitHub API强制要求User-Agent头 wc.Headers.Add("User-Agent", "C#-Version-Checker"); try { var jsonResponse = wc.DownloadString(apiUrl); var release = JsonSerializer.Deserialize<GitHubRelease>(jsonResponse); // 移除Tag通常带的v前缀(如v1.0.0 → 1.0.0) remoteVersion = release.TagName.TrimStart('v'); } catch (WebException ex) { Console.WriteLine($"获取最新Release失败:{ex.Message}"); return; } } // 获取本地版本(同方法一) string localVersion = null; if (File.Exists(localExePath)) { var versionInfo = FileVersionInfo.GetVersionInfo(localExePath); localVersion = versionInfo.ProductVersion; } // 对比版本并下载 if (string.IsNullOrEmpty(localVersion) || !remoteVersion.Equals(localVersion, StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("发现新版本,开始下载..."); var exeUrl = $"https://raw.githubusercontent.com/{get-id}/AutoUpdate/main/hello.exe"; using (var wc = new WebClient()) { wc.DownloadFile(exeUrl, localExePath); } Console.WriteLine("下载完成"); } else { Console.WriteLine("当前已是最新版本"); } // 用于反序列化GitHub API响应的实体类 public class GitHubRelease { public string TagName { get; set; } }
额外优化:版本号精准对比
如果是带后缀的复杂版本号(如1.0.1-beta),建议用Version类解析对比,避免字符串匹配误差:
if (Version.TryParse(localVersion, out var localVer) && Version.TryParse(remoteVersion, out var remoteVer)) { if (remoteVer > localVer) { // 执行下载逻辑 } }
内容的提问来源于stack exchange,提问作者Bruse
相关产品推荐
相关产品推荐

