.Net?Winform開(kāi)發(fā)顯示程序版本號(hào)的常見(jiàn)方式
歡迎關(guān)注dotnet研習(xí)社,今天我們討論一個(gè)Winform開(kāi)發(fā)中的一個(gè)常見(jiàn)的需求內(nèi)容“關(guān)于程序的版本號(hào)顯示”。
在 WinForms 桌面應(yīng)用程序開(kāi)發(fā)中,向用戶(hù)顯示當(dāng)前程序的版本號(hào)是一個(gè)常見(jiàn)的需求,尤其是在產(chǎn)品發(fā)布、更新提示或技術(shù)支持場(chǎng)景中尤為重要。在.NET 8 中已全面采用 SDK 風(fēng)格項(xiàng)目,相比舊的 .NET Framework 項(xiàng)目,版本號(hào)的設(shè)置和讀取方式更加規(guī)范和現(xiàn)代化。本文將介紹在 WinForms 應(yīng)用中顯示程序版本號(hào)的幾種常見(jiàn)方式,并附上示例代碼,供大家參考和選擇。
項(xiàng)目準(zhǔn)備
確保我們的 .csproj 是 SDK 風(fēng)格,并配置版本號(hào):
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net8.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <!-- 版本信息設(shè)置 --> <Version>1.2.3</Version> <FileVersion>1.2.3.0</FileVersion> <AssemblyVersion>1.2.0.0</AssemblyVersion> <InformationalVersion>1.2.3-beta</InformationalVersion> </PropertyGroup> </Project>
示例 1:窗體標(biāo)題欄顯示版本號(hào)
使用 Application.ProductVersion
示例代碼:
public partial class MainForm : Form { public MainForm() { InitializeComponent(); this.Text = $"我的程序 - 版本 {Application.ProductVersion}"; } }
說(shuō)明:
- 輸出示例:
我的程序 - 版本 1.2.3-beta
- 適用于:簡(jiǎn)潔快速展示,適合主界面。
示例 2:Label 中顯示版本號(hào)
使用 AssemblyVersion
示例代碼:
using System.Reflection; public partial class MainForm : Form { public MainForm() { InitializeComponent(); var version = Assembly.GetExecutingAssembly().GetName().Version; Label lblVersion = new Label { Text = $"程序集版本:{version}", AutoSize = true, Location = new Point(20, 20) }; this.Controls.Add(lblVersion); } }
說(shuō)明:
- 輸出示例:
程序集版本:1.2.0.0
- 適用于:開(kāi)發(fā)或內(nèi)部測(cè)試查看版本綁定。
示例 3:狀態(tài)欄中顯示版本號(hào)
使用 FileVersionInfo
示例代碼:
在窗體中添加了 StatusStrip
和 ToolStripStatusLabel
控件,命名為 statusStrip1
和 toolStripStatusLabel1
。
using System.Diagnostics; public partial class MainForm : Form { public MainForm() { InitializeComponent(); var info = FileVersionInfo.GetVersionInfo(Application.ExecutablePath); toolStripStatusLabel1.Text = $"文件版本:{info.FileVersion}"; } }
說(shuō)明:
- 輸出示例:
文件版本:1.2.3.0
- 適用于:狀態(tài)欄、底部信息區(qū)。
示例 4:AboutBox 顯示版本號(hào)
使用 Application.ProductVersion
添加步驟:
在窗體中添加了 menuStrip
和 toolStripMenuItem
控件,命名為 menuStrip1
和 toolStripMenuItem1
。
- 添加 → 新建項(xiàng) → “關(guān)于框(About Box)”
- 在
AboutBox1.cs
修改版本號(hào)設(shè)置:
partial class AboutBox1 : Form { public AboutBox1() { InitializeComponent(); this.Text = String.Format("關(guān)于 {0}", AssemblyTitle); this.labelProductName.Text = AssemblyProduct; this.labelVersion.Text = String.Format("版本 {0}", AssemblyVersion); this.labelCopyright.Text = AssemblyCopyright; this.labelCompanyName.Text = AssemblyCompany; this.textBoxDescription.Text = AssemblyDescription; } #region 程序集特性訪問(wèn)器 public string AssemblyTitle { get { object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); if (attributes.Length > 0) { AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; if (titleAttribute.Title != "") { return titleAttribute.Title; } } return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); } } public string AssemblyVersion { get { return Assembly.GetExecutingAssembly().GetName().Version.ToString(); } } public string AssemblyDescription { get { object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); if (attributes.Length == 0) { return ""; } return ((AssemblyDescriptionAttribute)attributes[0]).Description; } } public string AssemblyProduct { get { object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); if (attributes.Length == 0) { return ""; } return ((AssemblyProductAttribute)attributes[0]).Product; } } public string AssemblyCopyright { get { object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); if (attributes.Length == 0) { return ""; } return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; } } public string AssemblyCompany { get { object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); if (attributes.Length == 0) { return ""; } return ((AssemblyCompanyAttribute)attributes[0]).Company; } } #endregion }
調(diào)用方式:
private void toolStripMenuItem1_Click(object sender, EventArgs e) { new AboutBox1().ShowDialog(); }
示例 5:讀取外部版本文件
CI 自動(dòng)生成 version.txt
準(zhǔn)備版本文件:
項(xiàng)目發(fā)布后輸出目錄含有 version.txt
內(nèi)容如:
1.2.3+build.12345
示例代碼:
public partial class MainForm : Form { public MainForm() { InitializeComponent(); string versionFile = Path.Combine(AppContext.BaseDirectory, "version.txt"); string buildVersion = File.Exists(versionFile) ? File.ReadAllText(versionFile).Trim() : "Unknown"; Label lbl = new Label { Text = $"構(gòu)建版本:{buildVersion}", AutoSize = true, Location = new Point(20, 50) }; this.Controls.Add(lbl); } }
示例 6:統(tǒng)一封裝 VersionHelper 工具類(lèi)
using System.Reflection; using System.Diagnostics; public static class VersionHelper { public static string AssemblyVersion => Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "Unknown"; public static string FileVersion => FileVersionInfo.GetVersionInfo(Application.ExecutablePath).FileVersion ?? "Unknown"; public static string ProductVersion => Application.ProductVersion ?? "Unknown"; }
調(diào)用方式:
Label lbl = new Label { Text = $"程序集版本:{VersionHelper.AssemblyVersion}\n文件版本:{VersionHelper.FileVersion}", AutoSize = true, Location = new Point(20, 80) }; this.Controls.Add(lbl);
對(duì)比總結(jié)
方式編號(hào) | 獲取方式 | 來(lái)源(csproj 或程序集) | 示例輸出 | 推薦用途 | 特點(diǎn)說(shuō)明 |
---|---|---|---|---|---|
① | Application.ProductVersion | <InformationalVersion>(或 <Version>) | 1.2.3-beta | UI顯示(標(biāo)題欄、關(guān)于框、Label) | 默認(rèn)最直觀,獲取產(chǎn)品版本,強(qiáng)烈推薦 |
② | Assembly.GetExecutingAssembly().GetName().Version | <AssemblyVersion> | 1.2.0.0 | 內(nèi)部模塊依賴(lài)、調(diào)試 | 獲取程序集綁定版本,不一定展示給用戶(hù) |
③ | FileVersionInfo.FileVersion | <FileVersion> | 1.2.3.0 | 狀態(tài)欄、日志、故障排查 | Windows 文件屬性中可見(jiàn)的“文件版本” |
④ | FileVersionInfo.ProductVersion | <InformationalVersion>(或 <Version>) | 1.2.3-beta | 技術(shù)支持、版本詳情 | 和 Application.ProductVersion 一致 |
⑤ | 讀取 version.txt、嵌入資源等 | CI/CD 或 Git 自動(dòng)生成 | 1.2.3+g123abc | 內(nèi)部構(gòu)建版本控制 | 靈活但需配合構(gòu)建腳本或 CI 工具 |
⑥ | 自定義 AboutBox 顯示 | 可組合 ①~⑤ | 自由定制 | 標(biāo)準(zhǔn)“關(guān)于”窗口 | 常用于商業(yè)軟件,集中展示版本、版權(quán)等 |
推薦選擇指南
開(kāi)發(fā)初期快速顯示:使用 Application.ProductVersion
需要對(duì)比程序集版本綁定:使用 AssemblyVersion
需要展示文件詳細(xì)版本(如系統(tǒng)托盤(pán)右鍵):使用 FileVersionInfo
需要區(qū)分構(gòu)建版本(多環(huán)境發(fā)布):結(jié)合 CI 寫(xiě)入 version.txt
面向最終用戶(hù)展示:統(tǒng)一寫(xiě)入 AboutBox,使用封裝工具類(lèi)讀取版本
以上就是.Net Winform開(kāi)發(fā)顯示程序版本號(hào)的常見(jiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于.Net顯示程序版本號(hào)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#類(lèi)的創(chuàng)建與初始化實(shí)例解析
這篇文章主要介紹了C#類(lèi)的創(chuàng)建與初始化實(shí)例解析,有助于初學(xué)者較為直觀的理解C#的類(lèi),需要的朋友可以參考下2014-07-07C#定時(shí)每天00點(diǎn)00分00秒自動(dòng)重啟軟件
這篇文章主要為大家詳細(xì)介紹了C#定時(shí)每天00點(diǎn)00分00秒自動(dòng)重啟軟件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08c#遍歷System.drawing.Color下面的所有顏色以及名稱(chēng)以查看
c#遍歷System.drawing.Color下面的所有顏色以及名稱(chēng)以查看,需要的朋友可以參考一下2013-02-02C#實(shí)現(xiàn)根據(jù)字節(jié)數(shù)截取字符串并加上省略號(hào)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)根據(jù)字節(jié)數(shù)截取字符串并加上省略號(hào)的方法,比較實(shí)用的功能,需要的朋友可以參考下2014-07-07C#中使用jieba.NET、WordCloudSharp制作詞云圖的步驟
之前一篇文章介紹的是使用Python的jieba、wordcloud的庫(kù)生成詞云圖,本文則介紹在C#中如何使用jieba.NET、WordCloudSharp庫(kù)生成詞云圖,感興趣的朋友一起看看吧2021-07-07C#中System.Array.CopyTo() 和 System.Array.Clon()&nbs
System.Array.CopyTo()和System.Array.Clone()是用于數(shù)組復(fù)制的兩種不同方法,本文就來(lái)介紹C,#中System.Array.CopyTo() 和 System.Array.Clon() 的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04C# 通過(guò)Socket讀取大量數(shù)據(jù)的示例
這篇文章主要介紹了C# 通過(guò)Socket讀取大量數(shù)據(jù)的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C#實(shí)現(xiàn)導(dǎo)入CSV文件到Excel工作簿的方法
這篇文章主要介紹了C#實(shí)現(xiàn)導(dǎo)入CSV文件到Excel工作簿的方法,涉及C#針對(duì)office組件的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06