当前位置: 代码网 > it编程>编程语言>Asp.net > C# Winform 软件版本号自动增加的实现示例

C# Winform 软件版本号自动增加的实现示例

2025年11月07日 Asp.net 我要评论
一、简介在平时的开发中,版本号的是常用的功能,除非你的程序不经常更新,光看软件的界面不可能就知道代码具体改了什么。在 c# 的开发中,很多程序员依然是手动的去改版本号,但非常的麻烦,每次生成前必须去a

一、简介

在平时的开发中,版本号的是常用的功能,除非你的程序不经常更新,光看软件的界面不可能就知道代码具体改了什么。在 c# 的开发中,很多程序员依然是手动的去改版本号,但非常的麻烦,每次生成前必须去 assemblyinfo.cs 这个类中修改,但不排除部分公司压根不用软件版本号这个功能,我以前就遇到过,虽然他们不用,但也不影响软件的正常运行,不管怎样,版本号的管理加上去还是好的。

版本号主要分为4个部分,如 1.0.0.0,分别是 主版本.次版本.构建号.修订号。

我想定义的规则:

比如第四位满 99,就让第三位+1,第三位满99,就 让第二位+1,比如:

旧版本递增后解释
1.0.0.991.0.1.0修订号 进位
1.0.99.991.1.0.0修订号 & 构建号 进位
1.99.99.992.0.0.0修订号 & 构建号 & 次版本号 全部进位
99.99.99.99100.0.0.0主版本号 进位

目前这套实现方式,就是根据这个规则来实现的,如果你想用其他的规则,需要自己修改。

下面的两个实现方式中,方式一比较麻烦,不推荐,方式二的实现比较简单,不用修改项目的配置文件,用起来也方便,推荐!

二、方式一

使用 version.txt 和 assemblyinfo.cs 两个文件,他们的作用如下:

1.保持“版本状态”

version.txt 作为一个“存储文件”,让每次构建都能基于上一次的版本号递增。
这样即使你关闭 visual studio 或者换台电脑,版本号还是可以从上次的版本继续增加,而不会因为 assemblyinfo.cs 被编译后“丢失状态”。

2.构建时的版本读取

csproj 读取 version.txt,然后传递给 updateversion.ps1,这样 powershell 不会从零开始,而是从已有的版本继续递增。
powershell 先更新 assemblyinfo.cs,然后 再更新 version.txt,保证下次构建继续递增。

1.新建文件 version.txt

位置在项目的根目录,如图:

在 version.txt 里面填写一个版本号:1.0.0.0

2.新建文件 updateversion.ps1

位置在根目录,可以参考上面步骤1中的图片,内容如下:

param(
    [string]$currentversion,
    [string]$filepath
)

# 获取 version.txt 的路径
$versionfile = "$psscriptroot\version.txt"

# 解析版本号
$parts = $currentversion -split "\."
$major = [int]$parts[0]
$minor = [int]$parts[1]
$build = [int]$parts[2]
$revision = [int]$parts[3]

# 版本号递增逻辑
$revision++
if ($revision -ge 100) {
    $revision = 0
    $build++
    
    if ($build -ge 100) {
        $build = 0
        $minor++
        
        if ($minor -ge 100) {
            $minor = 0
            $major++
        }
    }
}

$newversion = "$major.$minor.$build.$revision"

# 更新 assemblyinfo.cs
$content = get-content $filepath
$content = $content -replace '\[assembly: assemblyversion\(".*?"\)\]', "[assembly: assemblyversion(`"$newversion`")]"
$content = $content -replace '\[assembly: assemblyfileversion\(".*?"\)\]', "[assembly: assemblyfileversion(`"$newversion`")]"
set-content -path $filepath -value $content

# 更新 version.txt
set-content -path $versionfile -value $newversion

write-output $newversion

3.修改 .csproj 文件

这个是项目的配置文件,打开后,在标签的最后添加下面的代码:

<target name="updateassemblyversion" beforetargets="beforebuild">
    <propertygroup>
        <versionfile>$(projectdir)version.txt</versionfile>
        <assemblyinfofile>$(projectdir)properties\assemblyinfo.cs</assemblyinfofile>
    </propertygroup>

    <readlinesfromfile file="$(versionfile)">
        <output taskparameter="lines" propertyname="newversion" />
    </readlinesfromfile>

    <message text="updating assemblyinfo.cs with version $(newversion)" importance="high" />

    <exec command="powershell -executionpolicy bypass -noprofile -file &quot;$(projectdir)updateversion.ps1&quot; &quot;$(newversion)&quot; &quot;$(assemblyinfofile)&quot;" />
</target>

在生成项目后,或者重新生成后,版本号就会自动的+1,如图:

同时 version.txt 里的版本号也会自动增加

打开项目的 assemblyinfo.cs 文件,你会发现这里也自动更改了,如下:

二、方式二

在方式一中,必须要手动的建一个文件 version.txt,这是因为 assemblyinfo.cs 文件有时候在项目迁移过程中,可能会丢失,或者多人合作,导致版本号异常,如果你是单人,也可以直接修改 assemblyinfo.cs 来让版本号自动增加

对比方式一,方法二的实现就非常的简单了,这个是我比较喜欢的方式。

1.新建文件 updateversion.ps1

位置在项目的根目录,内容如下:

# 获取当前脚本所在的项目根目录
$projectpath = split-path -parent $myinvocation.mycommand.path
$assemblyinfopath = "$projectpath\properties\assemblyinfo.cs"

# 检查文件是否存在
if (-not (test-path $assemblyinfopath)) {
    write-output "error: assemblyinfo.cs not found at $assemblyinfopath"
    exit 1
}

# 读取文件内容
$content = get-content $assemblyinfopath -raw

# 匹配版本号
$pattern = '\[assembly: assemblyversion\("(\d+)\.(\d+)\.(\d+)\.(\d+)"\)\]'

if ($content -match $pattern) {
    $major = [int]$matches[1]
    $minor = [int]$matches[2]
    $build = [int]$matches[3]
    $revision = [int]$matches[4]

    # 版本号递增逻辑
    $revision++
    if ($revision -ge 100) {
        $revision = 0
        $build++
    }
    if ($build -ge 100) {
        $build = 0
        $minor++
    }
    if ($minor -ge 100) {
        $minor = 0
        $major++
    }

    # 生成新的版本号
    $newversion = "$major.$minor.$build.$revision"

    # 替换 assemblyinfo.cs 中的版本号
    $newcontent = $content -replace $pattern, "[assembly: assemblyversion(`"$newversion`")]"
    $newcontent = $newcontent -replace '\[assembly: assemblyfileversion\("(\d+)\.(\d+)\.(\d+)\.(\d+)"\)\]', "[assembly: assemblyfileversion(`"$newversion`")]"

    # 写回文件
    set-content -path $assemblyinfopath -value $newcontent -encoding utf8

    write-output "updated version to $newversion"
} else {
    write-output "assemblyversion not found in $assemblyinfopath!"
}

位置:

2.添加“生成后事件命令行”

打开项目,在 项目的属性 --> 生成事件 --> 生成后事件命令行 输入了提供的命令,就能完成这个需求

命令:

powershell -executionpolicy bypass -file "$(projectdir)updateversion.ps1"

位置:

效果:

每次生成,或者重新生成后,这里都会自动+1。

如果你想读取这些版本号,可以这么做:

using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.reflection;
using system.text;
using system.threading.tasks;
using system.windows.forms;

namespace test5
{
    public partial class form1: form
    {
        public form1()
        {
            initializecomponent();
        }

        private void form1_load(object sender, eventargs e)
        {
            console.writeline("程序集版本号:{0}", getassemblyversion());
            console.writeline("程序集文件版本号:{0}", assemblyfileversion());
        }

        /// <summary>
        /// 读取程序集版本号
        /// </summary>
        /// <returns></returns>
        private string getassemblyversion()
        {
            var assembly = assembly.getexecutingassembly();
            return assembly?.getname().version?.tostring();
        }

        /// <summary>
        /// 读取程序集文件版本号
        /// </summary>
        /// <returns></returns>
        private string assemblyfileversion()
        {
            object[] attributes = assembly.getexecutingassembly()
                .getcustomattributes(typeof(assemblyfileversionattribute), false);
            if (attributes.length != 0)
                return ((assemblyfileversionattribute)attributes[0]).version;
            else
                return string.empty;
        }
    }
}

运行:

到此这篇关于c# winform 软件版本号自动增加的实现示例的文章就介绍到这了,更多相关c# winform 软件版本号自动增加内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com