Heim  >  Artikel  >  Backend-Entwicklung  >  Beispielanalyse zur automatischen Aktualisierung lokaler Programme in C#

Beispielanalyse zur automatischen Aktualisierung lokaler Programme in C#

黄舟
黄舟Original
2017-08-08 14:13:152395Durchsuche

Über automatische Updates des Systems. In letzter Zeit kam es vor, dass der lokale Client mit der neuesten Version der Systemdateien im Java-Backend überschrieben werden musste, was als automatisches Update bezeichnet wird.

Das lokale System erhält die Versionsnummer des aktuellen Systems, um die Java-Schnittstellendaten im Hintergrund anzufordern. Was mir zurückgegeben wird, ist der aus dem Hintergrundkomprimierungspaket konvertierte Base64-Byte-Stream.

Der Client muss das lokale Programm aktualisieren, um die neue Version zu erhalten.


    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());

Hier ist es ist Holen Sie sich den Byte-Stream.

Diese Methode kann das Problem lösen, dass mehrere Projekte in derselben Lösung die App.config unter demselben Projekt lesen können.

Hinweis: Es gibt referenzierte Klassenbibliotheken, die zum Betrieb komprimierter Pakete verwendet werden.

Lassen Sie uns über die Idee sprechen: Der erste Schritt besteht darin, den Bytestrom des komprimierten Pakets abzurufen und ihn lokal zu speichern. Der zweite Schritt besteht darin, die Dateien des komprimierten Pakets zu durchlaufen und die lokalen Dateien zu ersetzen, um den Vorgang abzuschließen das Versionsupdate des lokalen Systems.

Egal ob einfach oder komplex, wir müssen Schritt für Schritt vorankommen.

Das obige ist der detaillierte Inhalt vonBeispielanalyse zur automatischen Aktualisierung lokaler Programme in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn