前言 欢迎关注dotnet研习社,今天我们讨论一个Winform开发中的一个常见的需求内容“关于程序的版本号显示”。
在 WinForms 桌面应用程序开发中,向用户显示当前程序的版本号是一个常见的需求,尤其是在产品发布、更新提示或技术支持场景中尤为重要。在.NET 8 中已全面采用 SDK 风格项目 ,相比旧的 .NET Framework 项目,版本号的设置
和读取方式更加规范和现代化。本文将介绍在 WinForms 应用中显示程序版本号的几种常见方式,并附上示
例代码,供大家参
☑ 项目准备 确保我们的 .csproj
是 SDK 风格,并配置版本号:
< Project Sdk = "Microsoft.NET.Sdk.WindowsDesktop" > < PropertyGroup > < OutputType > WinExe </ OutputType > < TargetFramework > net8.0-windows </ TargetFramework > < UseWindowsForms > true </ UseWindowsForms > <!-- 版本信息设置 --> < 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:窗体标题栏显示版本号(使用 Application.ProductVersion
) 示例代码: public partial class MainForm : Form { public MainForm () { InitializeComponent(); this .Text = $"我的程序 - 版本 {Application.ProductVersion} " ; } }
说明:
• 输出示例: 我的程序 - 版本 1.2.3-beta
✅ 示例 2:Label 中显示版本号(使用 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); } }
说明:
✅ 示例 3:状态栏中显示版本号(使用 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} " ; } }
说明:
✅ 示例 4:AboutBox 显示版本号(使用 Application.ProductVersion
) 添加步骤: 在窗体中添加了 menuStrip
和 toolStripMenuItem
控件,命名为 menuStrip1
和 toolStripMenuItem1
。
1. 添加 → 新建项 → “关于框(About Box)” 2. 在 AboutBox1.cs
修改版本号设置: partial class AboutBox1 : Form { public AboutBox1 () { InitializeComponent(); this .Text = String.Format( "关于 {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 程序集特性访问器 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 }
private void toolStripMenuItem1_Click ( object sender, EventArgs e ) { new AboutBox1().ShowDialog(); }
✅ 示例 5:读取外部版本文件(CI 自动生成 version.txt
) 准备版本文件: 项目发布后输出目录含有 version.txt
内容如:
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 = $"构建版本: {buildVersion} " , AutoSize = true , Location = new Point( 20 , 50 ) }; this .Controls.Add(lbl); } }
✅ 示例 6:统一封装 VersionHelper
工具类 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" ; }
调用方式: Label lbl = new Label { Text = $"程序集版本: {VersionHelper.AssemblyVersion} \n文件版本: {VersionHelper.FileVersion} " , AutoSize = true , Location = new Point( 20 , 80 ) }; this .Controls.Add(lbl);
对比总结
Application.ProductVersion
<InformationalVersion>
1.2.3-beta
Assembly.GetExecutingAssembly().GetName().Version
<AssemblyVersion>
1.2.0.0
FileVersionInfo.FileVersion
<FileVersion>
1.2.3.0
FileVersionInfo.ProductVersion
<InformationalVersion>
1.2.3-beta
和 Application.ProductVersion 一致 1.2.3+g123abc
阅读原文:原文链接
该文章在 2025/5/14 10:11:49 编辑过