시스템 자동 업데이트에 대해. 최근에는 Java 백엔드에 있는 시스템 파일을 최신 버전으로 로컬 클라이언트에 덮어써야 하는 상황이 발생했는데, 이를 자동 업데이트라고 합니다.
로컬 시스템은 현재 시스템의 버전 번호를 얻어 백그라운드 Java 인터페이스 데이터를 요청합니다. 나에게 반환되는 것은 백그라운드 압축 패키지에서 변환된 base64 바이트 스트림입니다.
클라이언트는 새 버전을 받을 때 로컬 프로그램을 업데이트해야 합니다.
if (UpdateSystem(Path.Combine(Application.StartupPath, "Version.txt"), Path.Combine(Application.StartupPath, "u.zip"))) { Application.Exit(); }
/// <summary> /// 读取本地版本请求更新 /// </summary> /// <param name="document">读取的文件信息</param> /// <param name="zipPath">返回zip包本地路径</param> /// <returns></returns> private bool UpdateSystem(string document, string zipPath) { try { Dictionary<string, string> postDic = new Dictionary<string, string>(); //获取文件内的版本号 if(File.Exists(document)) { postDic.Add("version", File.ReadAllText(document).Trim()); } else { postDic.Add("version", "0"); } string postJson = JsonConvert.SerializeObject(postDic); string url = GetAppSettingValue("serverUrl") + "parkClient/parkClientUpdate"; //返回的json数据 JObject obj = (JObject)JsonConvert.DeserializeObject(PostData(postJson, url)); string newVersion = obj["version"].ToString(); if (!String.IsNullOrWhiteSpace(newVersion)) { byte[] bytesFile = Convert.FromBase64String(obj["byteArray"].ToString()); if (obj["clientMD5"].ToString() == BitConverter.ToString( new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(bytesFile)).Replace("-", "")) { ZipCoverage(bytesFile, zipPath); File.WriteAllText(document, newVersion); } } return true; } catch (Exception ex) { MessageBox.Show(ex.Message); return false; } } /// <summary> /// 解压zip包覆盖更新 /// </summary> /// <param name="bytes">接受更新包的字节信息</param> /// <param name="zpath">覆盖的路径</param> private void ZipCoverage(byte[] bytes, string zpath) { File.WriteAllBytes(zpath, bytes); using (ZipArchive archive = ZipFile.OpenRead(zpath)) { string file = null; foreach (ZipArchiveEntry entry in archive.Entries) { if (!entry.FullName.EndsWith("/")) { file = Path.Combine(Application.StartupPath, entry.FullName); if (File.Exists(file)) { File.Delete(file); } } } } ZipFile.ExtractToDirectory(zpath, Application.StartupPath); } /// <summary> /// 获取配置文件中的appSettings节中的配置内容 /// </summary> /// <param name="appSettingKey"></param> /// <param name="message"></param> /// <returns></returns> private string GetAppSettingValue(string appSettingKey) { ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = @"TDH.Parking.Client.exe.config" }; return ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).AppSettings.Settings[appSettingKey].Value; }
byte[] bytesFile = Convert.FromBase64String(obj["byteArray"].ToString());
여기서 얻은 바이트 스트림이 있습니다.
이 방법은 동일한 솔루션의 여러 프로젝트가 동일한 프로젝트의 App.config 파일을 읽을 수 있는 문제를 해결할 수 있습니다.
참고: 압축된 패키지를 작동하는 데 사용되는 참조 클래스 라이브러리 가 있습니다.
아이디어에 대해 이야기해 보겠습니다. 첫 번째 단계는 실제로 압축된 패키지의 바이트 스트림을 가져와서 로컬에 저장하는 것입니다. 두 번째 단계는 압축된 패키지 파일을 반복하여 로컬 파일을 교체하여 버전 업데이트를 완료하는 것입니다. 로컬 시스템.
단순하든 복잡하든 한걸음씩 앞으로 나아가야 합니다.
위 내용은 C#에서 로컬 프로그램을 자동으로 업데이트하는 방법에 대한 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!