.Net Winform开发显示程序版本号的常见方式

 更新时间:2025年05月13日 16:03:38   作者:dotnet研习社  
在 WinForms 桌面应用程序开发中,向用户显示当前程序的版本号是一个常见的需求,本文将介绍在 WinForms 应用中显示程序版本号的几种常见方式,大家可以了解下

欢迎关注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);
    }
}

说明:

  • 输出示例:程序集版本:1.2.0.0
  • 适用于:开发或内部测试查看版本绑定。

示例 3:状态栏中显示版本号

使用 FileVersionInfo

示例代码:

在窗体中添加了 StatusStripToolStripStatusLabel 控件,命名为 statusStrip1toolStripStatusLabel1

using System.Diagnostics;

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        var info = FileVersionInfo.GetVersionInfo(Application.ExecutablePath);
        toolStripStatusLabel1.Text = $"文件版本:{info.FileVersion}";
    }
}

说明:

  • 输出示例:文件版本:1.2.3.0
  • 适用于:状态栏、底部信息区。

示例 4:AboutBox 显示版本号

使用 Application.ProductVersion

添加步骤:

在窗体中添加了 menuStriptoolStripMenuItem 控件,命名为 menuStrip1toolStripMenuItem1

  • 添加 → 新建项 → “关于框(About Box)”
  • 在 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);

对比总结

方式编号获取方式来源(csproj 或程序集)示例输出推荐用途特点说明
Application.ProductVersion<InformationalVersion>(或 <Version>)1.2.3-betaUI显示(标题栏、关于框、Label)默认最直观,获取产品版本,强烈推荐
Assembly.GetExecutingAssembly().GetName().Version<AssemblyVersion>1.2.0.0内部模块依赖、调试获取程序集绑定版本,不一定展示给用户
FileVersionInfo.FileVersion<FileVersion>1.2.3.0状态栏、日志、故障排查Windows 文件属性中可见的“文件版本”
FileVersionInfo.ProductVersion<InformationalVersion>(或 <Version>)1.2.3-beta技术支持、版本详情和 Application.ProductVersion 一致
读取 version.txt、嵌入资源等CI/CD 或 Git 自动生成1.2.3+g123abc内部构建版本控制灵活但需配合构建脚本或 CI 工具
自定义 AboutBox 显示可组合 ①~⑤自由定制标准“关于”窗口常用于商业软件,集中展示版本、版权等

推荐选择指南

开发初期快速显示:使用 Application.ProductVersion

需要对比程序集版本绑定:使用 AssemblyVersion

需要展示文件详细版本(如系统托盘右键):使用 FileVersionInfo

需要区分构建版本(多环境发布):结合 CI 写入 version.txt

面向最终用户展示:统一写入 AboutBox,使用封装工具类读取版本

以上就是.Net Winform开发显示程序版本号的常见方式的详细内容,更多关于.Net显示程序版本号的资料请关注脚本之家其它相关文章!

相关文章

  • C#程序实现将MySQL的存储过程转换成Oracle的存储过程

    C#程序实现将MySQL的存储过程转换成Oracle的存储过程

    文章介绍了如何使用C#控制台应用,将MySQL自增ID和批量插入语句转换为Oracle兼容的SEQUENCE、触发器和INSERTALL语法,实现存储过程自动适配,提升数据库迁移效率,需要的朋友可以参考下
    2025-10-10
  • 在winform下实现左右布局多窗口界面的方法

    在winform下实现左右布局多窗口界面的方法

    在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform、WPF中实现其实也很容易,通过本文给大家介绍在winform下实现左右布局多窗口界面的方法,本文介绍的非常详细,对winform布局相关知识感兴趣的朋友一起学习吧
    2016-02-02
  • c# 数据类型占用的字节数介绍

    c# 数据类型占用的字节数介绍

    本篇文章主要是对c#中数据类型占用的字节数进行了详细的介绍。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 使用C#实现简单的线性回归的代码详解

    使用C#实现简单的线性回归的代码详解

    最近注意到了NumSharp,想学习一下,最好的学习方式就是去实践,因此从github上找了一个用python实现的简单线性回归代码,然后基于NumSharp用C#进行了改写,需要的朋友可以参考下
    2024-01-01
  • C#操作SQLite数据库方法小结

    C#操作SQLite数据库方法小结

    这篇文章介绍了C#操作SQLite数据库的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#编程实现CMD定时关机的示例代码

    C#编程实现CMD定时关机的示例代码

    本文使用C#编程调用Windows的CMD命令提示符实现定时关机功能,通过System.Diagnostics.Process类创建CMD进程并执行定时关机命令,下面就来详细的介绍一下,感兴趣的可以了解一下
    2025-12-12
  • 基于C#的图表控件库 ScottPlot编译visual studio 2022

    基于C#的图表控件库 ScottPlot编译visual studio 2022

    基于 C# 的 图表控件库 ScottPlot,开源免费,可以用于开发一些上位机软件,如电压、电流波形的显示,开发【示波器】图形界面,可以显示一些图表、波形,总之功能比较的强大,本文介绍了基于C#的图表控件库 ScottPlot编译visual studio 2022,需要的朋友可以参考下
    2022-06-06
  • C#使用OpenCvSharp4实现读取本地视频

    C#使用OpenCvSharp4实现读取本地视频

    OpenCvSharp4库是一个基于.Net封装的OpenCV库,这篇文章主要介绍了C#使用OpenCvSharp4实现读取本地视频的详细教程,有需要的小伙伴可以参考下
    2024-01-01
  • C#绘制曲线图的方法

    C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • C#使用iTextSharp库将图片转换为PDF

    C#使用iTextSharp库将图片转换为PDF

    iTextSharp 是一个开源的 .NET 库,主要用于创建和操作 PDF 文档,本文主要介绍了如何使用 C# 和 iTextSharp 将图片转换为 PDF 的功能,需要的可以参考下
    2024-12-12

最新评论