網(wǎng)站開發(fā)的邏輯百度怎么發(fā)布自己的廣告
文章目錄
- 前言
- 運(yùn)行環(huán)境
- ClickOnce(Visual Studio 程序發(fā)布)
- IIS新建文件夾
- C# 控制臺(tái)測(cè)試
- 安裝測(cè)試
- 更新測(cè)試
- 卸載
- AutoUpdaterDotNET
- 實(shí)現(xiàn)原理
- 簡(jiǎn)單使用
- 新建一個(gè)WPF項(xiàng)目
- 代碼封裝
- 自動(dòng)更新代碼封裝
- 簡(jiǎn)單使用
- 總結(jié)
前言
雖然寫的大部分都是不聯(lián)網(wǎng)項(xiàng)目,上位機(jī)的項(xiàng)目一般寫好了就不動(dòng)了。但是說不定以后就需要自動(dòng)更新呢。桌面程序不像網(wǎng)頁,聯(lián)網(wǎng)就能用。而是要進(jìn)行版本號(hào)判斷進(jìn)行更新的。
運(yùn)行環(huán)境
- Visual Studio 2022
- .net core 8.0
- IIS
ClickOnce(Visual Studio 程序發(fā)布)
畢竟是微軟官方的部署方式,應(yīng)該是挺簡(jiǎn)單的
ClickOnce 安全性和部署
快速創(chuàng)建軟件安裝包-ClickOnce
IIS新建文件夾
C# 控制臺(tái)測(cè)試
新建一個(gè)簡(jiǎn)單的控制臺(tái)程序進(jìn)行測(cè)試
安裝測(cè)試
這里報(bào)錯(cuò)是因?yàn)闆]有簽名。
安裝成功,但是默認(rèn)路徑是C盤,有點(diǎn)尬尷
Choose install path for ClickOnce application during setup
更新測(cè)試
卸載
直接卸載即可
AutoUpdaterDotNET
AutoUpdater.NET github 倉(cāng)庫地址
AutoUpdater.NET 使用簡(jiǎn)介
實(shí)現(xiàn)原理
簡(jiǎn)單使用
新建一個(gè)WPF項(xiàng)目
<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>
/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();AutoUpdateTest();}public void AutoUpdateTest(){Assembly assembly = Assembly.GetEntryAssembly();LabelVersion.Text = $"Current Version : {assembly.GetName().Version}";//顯示版本號(hào)AutoUpdater.AppTitle = "升級(jí)更新";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) };//定時(shí)去檢測(cè)更新根據(jù)自己業(yè)務(wù)需求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");}}
代碼封裝
這里用到了之前的代碼
C# 自定義配置文件序列化生成+文件格式錯(cuò)誤自動(dòng)回檔
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;}/// <summary>/// 創(chuàng)建文件/// </summary>public void Init(){if(IsFileExist){try{Read();}catch (Exception ex){ShowMsg(ex.ToString());throw new Exception("文件讀取失敗!請(qǐng)確認(rèn)是否配置文件格式是否正確");}}else{Write();}}/// <summary>/// 覆蓋文件/// </summary>public void ReInit(){ShowMsg("正在覆蓋配置文件:" + FullPath);Write();}/// <summary>/// 寫入配置類/// </summary>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();}}/// <summary>/// 讀取配置類/// </summary>private void Read(){ShowMsg("正在讀取配置文件:"+FullPath);var xmlHelper = new XmlSerializer(typeof(T));using (StreamReader xmlReader = new StreamReader(FullPath)){Setting = (T)xmlHelper.Deserialize(xmlReader);xmlReader.Close();}}}
自動(dòng)更新代碼封裝
/// <summary>/// 自動(dòng)更新幫助類/// </summary>public class AutoUpdateHelper{/// <summary>/// 更新地址/// </summary>public string UpdateLogUrl { get => BaseUrl + "Updates/UpdateLog.html"; }/// <summary>/// 網(wǎng)路基本路徑/// </summary>public string BaseUrl { get; set; } = "http://localhost:10911/";/// <summary>/// Xml配置地址/// </summary>public string AutoXmlUrl { get => BaseUrl + "Updates/AutoUpdaterStarter.xml"; }/// <summary>/// 文件下載地址/// </summary>public string DownLoadUrl { get => BaseUrl + "DownLoads/Update.zip"; }/// <summary>/// Xml配置生成類/// </summary>public MyXmlConfigHelper<AutoUpdaterXmlEntity> MyXmlConfigHelper { get; set; } = new MyXmlConfigHelper<AutoUpdaterXmlEntity>(@"AutoUpdater\AutoUpdaterStarter.xml");/// <summary>/// 版本號(hào)/// </summary>public string VersionNo{get{Assembly assembly = Assembly.GetExecutingAssembly();return assembly.GetName().Version.ToString();}}/// <summary>/// 自動(dòng)更新默認(rèn)配置,Updates放配置文件,DownLoads放zip/// </summary>public AutoUpdateHelper(){AutoUpdater.AppTitle = $"升級(jí)更新";AutoUpdater.LetUserSelectRemindLater = true;AutoUpdater.RemindLaterTimeSpan = RemindLaterFormat.Minutes;AutoUpdater.RemindLaterAt = 1;AutoUpdater.ReportErrors = true;}/// <summary>/// 修改IIS網(wǎng)絡(luò)地址,Updates放配置文件,DownLoads放zip/// </summary>/// <param name="url"></param>public AutoUpdateHelper(string url):this(){this.BaseUrl = url;}/// <summary>/// 自動(dòng)更新程序/// </summary>public void Update(){AutoUpdater.Start(AutoXmlUrl);}/// <summary>/// 創(chuàng)建AutoXml文件/// </summary>public void CreateAutoXmlFile(){AutoUpdaterXmlEntity autoUpdaterXmlEntity = new AutoUpdaterXmlEntity(){Version = VersionNo,DownLoadUrl = DownLoadUrl,UpdateLogUrl = UpdateLogUrl};MyXmlConfigHelper.Setting = autoUpdaterXmlEntity;MyXmlConfigHelper.ReInit();}}/// <summary>/// 配置文件對(duì)應(yīng)實(shí)體/// </summary>[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";}
簡(jiǎn)單使用
總結(jié)
還是AutoHelper好使,簡(jiǎn)單好用。AutoHelper的UpdateLog.html就自己加描述了,就是簡(jiǎn)單的html語言。