专栏首页汪宇杰博客获取.NET Core应用的版本号

获取.NET Core应用的版本号

我们可以给.NET Core应用定义版本号,但如何在程序运行时读取呢?有几种做法。

首先,我们来看看一个典型的带有版本号的.NET Core工程。我们可以定义在工程文件(.csproj)上定义AssemblyVersion, FileVersion 以及 Version

AssemblyVersionFileVersion 属性必须用这样的格式 "major[.minor[.build[.revision]]]" 不然你会得到一个编译错误 (CS7034).

Version 可以包含自定义字符串,比如"-xyz"

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>

<OutputType>Exe</OutputType>

<TargetFramework>netcoreapp2.1</TargetFramework>

<AssemblyVersion>1.1.1.1</AssemblyVersion>

<FileVersion>2.2.2.2</FileVersion>

<Version>3.3.3.3-xyz</Version>

</PropertyGroup>

</Project>

在运行时,它会生成一个class文件

//------------------------------------------------------------------------------

// <auto-generated>

// This code was generated by a tool.

// Runtime Version:4.0.30319.42000

//

// Changes to this file may cause incorrect behavior and will be lost if

// the code is regenerated.

// </auto-generated>

//------------------------------------------------------------------------------

using System;

using System.Reflection;

[assembly: System.Reflection.AssemblyCompanyAttribute("netcoreappver")]

[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]

[assembly: System.Reflection.AssemblyFileVersionAttribute("2.2.2.2")]

[assembly: System.Reflection.AssemblyInformationalVersionAttribute("3.3.3.3-xyz")]

[assembly: System.Reflection.AssemblyProductAttribute("netcoreappver")]

[assembly: System.Reflection.AssemblyTitleAttribute("netcoreappver")]

[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.1")]

// Generated by the MSBuild WriteCodeFragment class.

基于以上的定义,我们来看看程序运行时怎么获取这些信息

1. AssemblyVersion

取得AssemblyVersion有两种方法。

如果你不在一个static方法里获取版本号,可以用:

GetType().Assembly.GetName().Version.ToString()

但是如果你想要在static方法里使用,可能就得创建一个别的类型,就像这样:

class Foo

{

public string GetAssemblyVersion()

{

return GetType().Assembly.GetName().Version.ToString();

}

}

然后

new Foo().GetAssemblyVersion()

这样的代码明显很丑陋。其实读取AssemblyVersion还有另一个方法:

Assembly.GetEntryAssembly().GetName().Version

这个方法在static或非static方法里都可以使用,两者返回的结果都是:1.1.1.1

2. FileVersion

我们可以使用 GetCustomAttribute 拓展方法去获得 AssemblyFileVersionAttribute 并且读取 Version 属性。

Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyFileVersionAttribute>().Version

它返回的是:2.2.2.2

3. Version

和 FileVersion 类似,但是这次我们用的是 AssemblyInformationalVersionAttribute

Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion

它返回的是:3.3.3.3

4. 完整案例代码

using System;

using System.Reflection;

namespace netcoreappver

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine($"GetType().Assembly.GetName().Version: " +

$"{new Foo().GetAssemblyVersion()}");

Console.WriteLine($"Assembly.GetEntryAssembly().GetName().Version: " +

$"{Assembly.GetEntryAssembly().GetName().Version}");

Console.WriteLine($"Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyFileVersionAttribute>().Version:" +

$"{Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyFileVersionAttribute>().Version}");

Console.WriteLine($"Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion:" +

$"{Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute> ().InformationalVersion}");

Console.ReadKey();

}

}

class Foo

{

public string GetAssemblyVersion()

{

return GetType().Assembly.GetName().Version.ToString();

}

}

}

5. 我该选择哪个版本号

根据这篇帖子 https://stackoverflow.com/questions/64602/what-are-differences-between-assemblyversion-assemblyfileversion-and-assemblyin

AssemblyVersion

引用你的程序集的其他程序集看到的版本。如果版本号改变,其他程序集必须更新引用。

AssemblyFileVersion

部署使用的版本号。你可以每次部署都增加版本号。这通常被安装程序使用。用它来标记相同AssemblyVersion但由不同build产生的程序集。

在Windows中,可以用文件属性对话框看到它。

如果可能的话,让MSBuild去自动生成它。AssemblyFileVersion是可选的,如果没有指定的话,会使用AssemblyVersion

我使用这种格式: major.minor.revision.build, 这是我在部署中使用的修订版 (Alpha, Beta, RC and RTM), 服务包,和热修改。

AssemblyInformationalVersion

程序集所在的产品版本。这是你用来给用户显示的版本号。这可以是个字符串,比如'1.0 Release Candidate'。

本文分享自微信公众号 - 汪宇杰博客(ediwangblog),作者:汪宇杰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 博客系统知多少:揭秘那些不为人知的学问(三)

    上篇《博客系统知多少:揭秘那些不为人知的学问(二)》介绍了博客的基本功能设计要点,本篇介绍博客的协议或标准。

    Edi Wang
  • 博客系统知多少:揭秘那些不为人知的学问(四)

    上篇《博客系统知多少:揭秘那些不为人知的学问(三)》介绍了博客协议或标准。本篇终章介绍设计博客系统有哪些知识点。

    Edi Wang
  • 博客系统知多少:揭秘那些不为人知的学问(二)

    上篇《博客系统知多少:揭秘那些不为人知的学问(一)》介绍了博客的历史、我的博客故事及博客的受众来源。本篇精彩继续,介绍博客基本功能设计要点。

    Edi Wang
  • 程序员面试被要求手写代码,你与顶级程序员的差别在哪?

    面试时,被要求手写代码,自信心爆棚的你,忽然有了提笔忘记的感觉,在一张纸上反复涂涂画画,勉强写出了一个功能,结果漏洞百出,面试过程相当不顺利,丢下笔,对...

    xcbeyond
  • 手机QQ里的注册那些事儿

    腾讯ISUX
  • 使用 Fontawesome 的 React 组件

    Fontawesome 是一套图表字体库框架,我们经常在项目中用到它的各式各样的图标,本文介绍的是如何使用其 React 组件形式的包应用到项目中。

    我与梦想有个约会
  • 基础知识 | 每日一练(20)

    士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ...

    闫小林
  • 玩深度学习选哪块英伟达 GPU?有性价比排名还不够!

    与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完全在另一个量级上。 而 GPU 的选择,会在根本上决定你的深度学习体验。那么,对于一名 DL...

    AI研习社
  • 开发 | 除了性价比排名,如何选购深度学习 GPU

    AI科技评论按:与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完全在另一个量级上。而 GPU 的选择,会在根本上决定你的深度学习体验。那么,...

    AI科技评论
  • python 总结

    py3study

扫码关注云+社区

领取腾讯云代金券