>  기사  >  백엔드 개발  >  C#에서 로컬 프로그램을 자동으로 업데이트하는 방법에 대한 분석 예

C#에서 로컬 프로그램을 자동으로 업데이트하는 방법에 대한 분석 예

黄舟
黄舟원래의
2017-08-08 14:13:152392검색

시스템 자동 업데이트에 대해. 최근에는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.