Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试

文章目录

  • 前言
  • 运行环境
  • ClickOnce(Visual Studio 程序发布)
  • IIS新建文件夹
  • C# 控制台测试
  • 安装测试
    • 更新测试
    • 卸载
  • AutoUpdaterDotNET
    • 实现原理
    • 简单使用
      • 新建一个WPF项目
    • 代码封装
      • 自动更新代码封装
      • 简单使用
  • 总结

前言

虽然写的大部分都是不联网项目,上位机的项目一般写好了就不动了。但是说不定以后就需要自动更新呢。桌面程序不像网页,联网就能用。而是要进行版本号判断进行更新的。

运行环境

  • Visual Studio 2022
  • .net core 8.0
  • IIS

ClickOnce(Visual Studio 程序发布)

毕竟是微软官方的部署方式,应该是挺简单的

ClickOnce 安全性和部署

快速创建软件安装包-ClickOnce

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第1张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第2张图片

IIS新建文件夹

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第3张图片

C# 控制台测试

新建一个简单的控制台程序进行测试
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第4张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第5张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第6张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第7张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第8张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第9张图片
在这里插入图片描述
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第10张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第11张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第12张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第13张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第14张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第15张图片

安装测试

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第16张图片

这里报错是因为没有签名。

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第17张图片


安装成功,但是默认路径是C盘,有点尬尴

Choose install path for ClickOnce application during setup

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第18张图片

更新测试

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第19张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第20张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第21张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第22张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第23张图片

卸载

直接卸载即可

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第24张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第25张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第26张图片

AutoUpdaterDotNET

AutoUpdater.NET github 仓库地址

AutoUpdater.NET 使用简介

在这里插入图片描述

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第27张图片

实现原理

IIS
Update.html:更新日志详细信息的内容
AutoUpdateStarter.xml:版本号信息
Update.zip:程序压缩包,覆盖式安装

简单使用

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第28张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第29张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第30张图片

新建一个WPF项目

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow"
        Height="450"
        Width="800">
    <Grid>
        <StackPanel>
            <TextBlock Text="版本1.0.1"
                       FontSize="50"
                       Name="LabelVersion" />
            <Button Content="按钮"  FontSize="30" Click="Button_Click"/>
        StackPanel>

    Grid>
Window>

    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            AutoUpdateTest();
        }

        public void AutoUpdateTest()
        {
            Assembly assembly = Assembly.GetEntryAssembly();
            LabelVersion.Text = $"Current Version : {assembly.GetName().Version}";//显示版本号
            AutoUpdater.AppTitle = "升级更新";
            Thread.CurrentThread.CurrentCulture =
                Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("zh");
            AutoUpdater.LetUserSelectRemindLater = true;
            AutoUpdater.RemindLaterTimeSpan = RemindLaterFormat.Minutes;
            AutoUpdater.RemindLaterAt = 1;
            AutoUpdater.ReportErrors = true;
            DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromMinutes(2) };//定时去检测更新根据自己业务需求
            timer.Tick += delegate { AutoUpdater.Start("http://localhost:10911/Updates/AutoUpdaterStarter.xml"); };
            timer.Start();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            AutoUpdater.Start("http://localhost:10911/Updates/AutoUpdaterStarter.xml");
        }
    }

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第31张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第32张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第33张图片

代码封装

这里用到了之前的代码

C# 自定义配置文件序列化生成+文件格式错误自动回档

   public class MyXmlConfigHelper<T>
   {
       public T Setting { get; set; }

       public string FileName { get; set; } = "MyConfig.xml";

       public string DirectoryPath
       {
           get
           {
               var regex = new Regex(@"\\(\w+)\.(\w+)$");
               return regex.Split(FullPath)[0];
           }
       }
       public string DebugPath { get => Directory.GetCurrentDirectory(); }

       public string FullPath { get => DebugPath + "\\" + FileName; }

       public bool IsFileExist { get => File.Exists(FullPath); }

       public bool IsDirectoryExist { get => Directory.Exists(DirectoryPath); }

       public Action<string> ShowMsg { get; set; } = (msg)=>Console.WriteLine(msg);

       public MyXmlConfigHelper()
       {

       }
       public MyXmlConfigHelper(string filename)
       {
           FileName = filename;
           if (!IsDirectoryExist)
           {
               DirectoryInfo directoryInfo = new DirectoryInfo(DirectoryPath);
               directoryInfo.Create();
           }
       }

       public MyXmlConfigHelper(T setting ,string filename):this(filename)
       {
           Setting = setting;
       }

       /// 
       /// 创建文件
       /// 
       public void Init()
       {
           if(IsFileExist)
           {
               try
               {
                   Read();
               }
               catch (Exception ex)
               {
                   ShowMsg(ex.ToString());
                   throw new Exception("文件读取失败!请确认是否配置文件格式是否正确");
               }
           }
           else
           {
               Write();
           }
       }

       /// 
       /// 覆盖文件
       /// 
       public void ReInit()
       {
           ShowMsg("正在覆盖配置文件:" + FullPath);
           Write();
       }
       /// 
       /// 写入配置类
       /// 
       private void Write()
       {
           ShowMsg("正在生成配置文件:" + FullPath);
           var xmlHelper = new XmlSerializer(typeof(T));
           using (StreamWriter xmlWriter = new StreamWriter(FullPath))
           {
               //去掉烦人的命名空间
               XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
               ns.Add("", "");
               xmlHelper.Serialize(xmlWriter, Setting, ns);
               xmlWriter.Close();
           }
       }

       /// 
       /// 读取配置类
       /// 
       private void Read()
       {
           ShowMsg("正在读取配置文件:"+FullPath);
           var xmlHelper = new XmlSerializer(typeof(T));
           using (StreamReader xmlReader = new StreamReader(FullPath))
           {
               
               Setting = (T)xmlHelper.Deserialize(xmlReader);
               xmlReader.Close();
           }
           
       }
   }

自动更新代码封装


  /// 
  /// 自动更新帮助类
  /// 
  public class AutoUpdateHelper
  {
      /// 
      /// 更新地址
      /// 
      public string UpdateLogUrl { get => BaseUrl + "Updates/UpdateLog.html"; }


      /// 
      /// 网路基本路径
      /// 
      public string BaseUrl { get; set; } = "http://localhost:10911/";

      /// 
      /// Xml配置地址
      /// 
      public string AutoXmlUrl { get => BaseUrl + "Updates/AutoUpdaterStarter.xml"; }

      /// 
      /// 文件下载地址
      /// 
      public string DownLoadUrl { get => BaseUrl + "DownLoads/Update.zip"; }


      /// 
      /// Xml配置生成类
      /// 
      public MyXmlConfigHelper<AutoUpdaterXmlEntity> MyXmlConfigHelper { get; set; } = new MyXmlConfigHelper<AutoUpdaterXmlEntity>(@"AutoUpdater\AutoUpdaterStarter.xml");

      /// 
      /// 版本号
      /// 
      public string VersionNo
      {
          get
          {
              Assembly assembly = Assembly.GetExecutingAssembly();
              return assembly.GetName().Version.ToString();
          }
      }

      /// 
      /// 自动更新默认配置,Updates放配置文件,DownLoads放zip
      /// 
      public AutoUpdateHelper()
      {
          AutoUpdater.AppTitle = $"升级更新";
          AutoUpdater.LetUserSelectRemindLater = true;
          AutoUpdater.RemindLaterTimeSpan = RemindLaterFormat.Minutes;
          AutoUpdater.RemindLaterAt = 1;
          AutoUpdater.ReportErrors = true;
      }
      /// 
      /// 修改IIS网络地址,Updates放配置文件,DownLoads放zip
      /// 
      /// 
      public AutoUpdateHelper(string url):this()
      {
          this.BaseUrl = url;
      }


      /// 
      /// 自动更新程序
      /// 
      public void Update()
      {
          AutoUpdater.Start(AutoXmlUrl);
      }


      /// 
      /// 创建AutoXml文件
      /// 
      public void CreateAutoXmlFile()
      {
          AutoUpdaterXmlEntity autoUpdaterXmlEntity = new AutoUpdaterXmlEntity()
          {
              Version = VersionNo,
              DownLoadUrl = DownLoadUrl,
              UpdateLogUrl = UpdateLogUrl
          };
          MyXmlConfigHelper.Setting = autoUpdaterXmlEntity;
          MyXmlConfigHelper.ReInit();
      }



  }

  /// 
  /// 配置文件对应实体
  /// 
  [XmlRoot("item")]
  public class AutoUpdaterXmlEntity
  {
      [XmlElement("version")]
      public string Version { get; set; }

      [XmlElement("url")]
      public string DownLoadUrl { get; set; }

      [XmlElement("changelog")]
      public string UpdateLogUrl { get; set; }

      [XmlElement("mandatory")]
      public string Mandatory { get; set; } = "false";
  }

简单使用

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第34张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第35张图片
Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第36张图片

Visual Studio 发布程序自动更新 ClickOnce和AutoUpdater测试_第37张图片

总结

还是AutoHelper好使,简单好用。AutoHelper的UpdateLog.html就自己加描述了,就是简单的html语言。

你可能感兴趣的:(C#,visual,studio,数据库,redis)