C#怎么获取程序集版本号_C#如何读取项目属性【总结】

2次阅读

Assembly.GetExecutingAssembly().GetName().Version 获取的是编译时固定的 AssemblyVersion,修改 AssemblyInfo.cs 无效;SDK 风格项目中版本由 .csproj 的 <Version> 或 <AssemblyVersion> 决定,修改后必须重新生成。

C#怎么获取程序集版本号_C# 如何读取项目属性【总结】

Assembly.GetExecutingAssembly().GetName().Version 拿到的是编译时版本,不是你改过的 AssemblyInfo.cs

很多人改了 AssemblyVersionAssemblyFileVersion 后,用 Assembly.GetExecutingAssembly().GetName().Version 读出来还是旧值,以为代码没生效。其实它只读 AssemblyVersion,而且这个值一旦编译进 DLL/EXE 就固定了——哪怕你后来手动改了源码、没重新编译,它也不会变。

  • AssemblyVersion 控制强命名和绑定重定向,必须在编译前定死;改了就得重新编译整个程序集
  • AssemblyFileVersionAssemblyInformationalVersion 是纯元数据,运行时可读,但要用对应属性取:FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion
  • 如果项目用 SDK 风格(.csproj 里有 <Sdk>Microsoft.NET.Sdk</Sdk>),AssemblyVersion 默认由 <Version><AssemblyVersion> MSBuild 属性生成,不是靠 AssemblyInfo.cs 文件

SDK 风格项目里,版本号实际来自 .csproj,不是 AssemblyInfo.cs

新建的 .NET 5+ 或较新 .NET Framework SDK 项目,Properties/AssemblyInfo.cs 往往是空的或被删了。所有版本相关属性都挪到了 .csproj 文件里。这时候改 AssemblyInfo.cs 完全无效。

  • 查当前生效的 AssemblyVersion:看 .csproj 中有没有 <AssemblyVersion>1.2.3.4</AssemblyVersion>;没写的话,默认取 <Version>1.2.3</Version> 的主副次三位补零(比如 1.2.31.2.3.0
  • AssemblyFileVersion 默认也继承 <Version>,但可单独设:<FileVersion>1.2.3.42</FileVersion>
  • 修改后必须重新生成(build),而不是仅保存文件——MSBuild 在编译阶段才把它们注入到程序集元数据中

想读“用户看到的版本号”,优先用 AssemblyInformationalVersion

Windows 资源管理器“属性→详细信息”里显示的“产品版本”,或者安装包、发布说明里写的那个带字母的版本(如 2.1.0-beta),对应的是 AssemblyInformationalVersion。它不参与绑定,但最贴近业务语义。

  • 获取方式:Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion
  • 它在 SDK 项目中默认等于 <Version>,但可以显式覆盖:<AssemblyInformationalVersion>2.1.0-rc.1</AssemblyInformationalVersion>
  • 注意:这个值是字符串,不能直接当 Version 对象解析;含非数字字符(如 -beta)时,new Version(str) 会抛 ArgumentException

调试时发现版本号没更新?先确认是不是在读错程序集

常见误操作是调用了 Assembly.GetCallingAssembly() 或硬编码了某个类型(比如 typeof(Program).Assembly),结果读的是引用库的版本,不是当前执行项目的。

  • 最稳妥的是 Assembly.GetExecutingAssembly() —— 它返回当前正在执行的那行代码所在的程序集
  • 如果在类库中封装了版本读取逻辑,又希望返回宿主应用的版本,那就得靠调用方传入 Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly()
  • ASP.NET Core 应用中,GetEntryAssembly() 可能为 null(因为入口点是托管进程),此时应 fallback 到 Assembly.GetCallingAssembly() 或明确指定主程序集类型

版本号不是写在哪就从哪读的,关键看编译时谁写了元数据、运行时你找的是哪个程序集。最容易漏掉的其实是:改完 .csproj 没 rebuild,或者在多层引用里拿错了 Assembly 实例。

星耀云
版权声明:本站原创文章,由 星耀云 2026-03-20发表,共计2086字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources