assemblyversion是.net运行时用于强名称绑定和程序集加载的版本标识,必须为纯数字四段式;assemblyfileversion仅用于windows文件属性显示,不影响运行时解析。

AssemblyVersion 和 AssemblyFileVersion 有什么区别
很多人改完 AssemblyVersion 发现文件属性里的版本没变,或者反过来——改了文件版本,运行时 Assembly.GetExecutingAssembly().GetName().Version 还是旧的。这是因为两者作用完全不同:
-
AssemblyVersion是 .NET 运行时用来做强名称绑定和类型加载的关键标识,一旦修改,旧程序集引用它就会报FileNotFoundException或FileLoadException -
AssemblyFileVersion和AssemblyInformationalVersion只影响 Windows 文件属性(右键 → 属性 → 详细信息页),不参与运行时解析 -
AssemblyInformationalVersion支持语义化版本(如"2.1.0-beta"),而AssemblyVersion必须是纯数字四段式(如"2.1.0.0")
在哪儿写这些版本信息
它们都定义在 AssemblyInfo.cs(或 Directory.Build.props 中的 PropertyGroup)里,不是项目文件(.csproj)的 <version></version> 标签——那个只影响 NuGet 包版本,不影响程序集本身。
手动编辑 Properties/AssemblyInfo.cs 时,常见写法如下:
[assembly: AssemblyVersion("1.2.3.4")]
[assembly: AssemblyFileVersion("1.2.3.4")]
[assembly: AssemblyInformationalVersion("1.2.3-release")]
如果你用的是 SDK 风格项目(.NET 5+ 默认),推荐把版本统一提到 Directory.Build.props 或直接在 .csproj 的 PropertyGroup 里用 MSBuild 属性控制:
<propertygroup><assemblyversion>1.2.3.0</assemblyversion><fileversion>1.2.3.4</fileversion><informationalversion>1.2.3-release</informationalversion></propertygroup>
这样能避免手写重复、也方便 CI 自动注入。
为什么改了 AssemblyVersion 后引用项目报错
这是最常踩的坑:你改了主项目的 AssemblyVersion,但没同步更新所有依赖它的类库项目,或者 GAC 里还残留旧版本。运行时会严格比对 AssemblyName.Version,不一致就拒绝加载。
- 检查所有被引用的
.dll,用ildasm或dotnet assembly list(.NET 8+)确认实际加载的版本 - 若用强名称签名(
snk),AssemblyVersion变更后必须重新签名,否则编译失败 - 开发阶段建议固定
AssemblyVersion(如"1.0.0.*"),用AssemblyFileVersion承担日常迭代标识职责
发布时怎么自动更新版本号
手动改数字不可持续。CI 场景下常用两种方式:
- 用 Git 提交计数生成:在
.csproj中写<assemblyversion>$(GitCommitCount).0</assemblyversion>,再配合 Git 工具(如git rev-list --count HEAD)注入环境变量 - 用 GitHub Actions / Azure DevOps 的构建号:
<assemblyversion>$(Build.BuildNumber)</assemblyversion>(需确保格式合法,比如截取为纯数字) - 注意:不要让
AssemblyVersion含字母或点号过多(如"1.2.3-alpha"),.NET 运行时会直接拒载
真正难的不是怎么填版本号,而是搞清哪个版本字段控制哪块行为——填错位置,轻则显示异常,重则整个程序起不来。










