System.Version 类

本文提供了此 API 参考文档的补充说明。

Version 类表示程序集、操作系统或公共语言运行时的版本号。 版本号由两到四个组件组成:主要、次要、生成和修订。 主要和次要组件是必需的;生成和修订组件是可选的,但如果定义了修订组件,则需要生成组件。 所有定义的组件必须是大于或等于 0 的整数。 版本号的格式如下所示(可选组件以方括号显示):

主要minor[.build[.revision]]

组件按约定使用,如下所示:

  • 主要:具有相同名称但不同主版本的程序集不可互换。 更高的版本号可能表示无法假定向后兼容性的产品的重大重写。

  • 次要:如果两个程序集上的名称和主版本号相同,但次要版本号不同,这表示具有向后兼容性的意图显著增强。 此更高次要版本号可能表示产品的点版本或产品完全向后兼容的新版本。

  • 生成:内部版本号的差异表示同一源的重新编译。 当处理器、平台或编译器发生更改时,可能会使用不同的内部版本号。

  • 修订版:具有相同名称、主版本号和次要版本号的程序集,但不同的修订旨在完全可互换。 在修复以前发布的程序集中的安全漏洞的内部版本中,可能会使用更高的修订号。

只有内部版本或修订号不同的程序集的后续版本被视为以前版本的修补程序更新。

重要

尚未显式分配值的属性的值 Version 未定义(-1)。

使用 MajorRevision 属性 MinorRevision 可以识别应用程序的临时版本,例如,更正问题,直到可以释放永久解决方案。 此外,Windows NT 操作系统使用 MajorRevision 属性对 Service Pack 编号进行编码。

将版本信息分配给程序集

通常,类 Version 不用于向程序集分配版本号。 相反,该 AssemblyVersionAttribute 类用于定义程序集的版本,如本文中的示例所示。

检索版本信息

Version 对象最常用于存储有关某些系统或应用程序组件(例如操作系统)、公共语言运行时、当前应用程序的可执行文件或特定程序集的版本信息。 以下示例演示了一些最常见的方案:

  • 检索操作系统版本。 以下示例使用 OperatingSystem.Version 属性检索操作系统的版本号。

    // Get the operating system version.
    OperatingSystem os = Environment.OSVersion;
    Version ver = os.Version;
    Console.WriteLine("Operating System: {0} ({1})", os.VersionString, ver.ToString());
    
    // Get the operating system version.
    let os = Environment.OSVersion
    let ver = os.Version
    printfn $"Operating System: {os.VersionString} ({ver})"
    
    ' Get the operating system version.
    Dim os As OperatingSystem = Environment.OSVersion
    Dim ver As Version = os.Version
    Console.WriteLine("Operating System: {0} ({1})", os.VersionString, ver.ToString())
    
  • 检索公共语言运行时的版本。 以下示例使用 Environment.Version 属性检索有关公共语言运行时的版本信息。

    // Get the common language runtime version.
    Version ver = Environment.Version;
    Console.WriteLine("CLR Version {0}", ver.ToString());
    
    // Get the common language runtime version.
    let ver = Environment.Version
    printfn $"CLR Version {ver}"
    
    ' Get the common language runtime version.
    Dim ver As Version = Environment.Version
    Console.WriteLine("CLR Version {0}", ver.ToString())
    
  • 检索当前应用程序的程序集版本。 下面的示例使用 Assembly.GetEntryAssembly 该方法获取对 Assembly 表示应用程序可执行文件的对象的引用,然后检索其程序集版本号。

    using System;
    using System.Reflection;
    
    public class Example4
    {
       public static void Main()
       {
          // Get the version of the executing assembly (that is, this assembly).
          Assembly assem = Assembly.GetEntryAssembly();
          AssemblyName assemName = assem.GetName();
          Version ver = assemName.Version;
          Console.WriteLine("Application {0}, Version {1}", assemName.Name, ver.ToString());
       }
    }
    
    open System.Reflection
    
    // Get the version of the executing assembly (that is, this assembly).
    let assem = Assembly.GetEntryAssembly()
    let assemName = assem.GetName()
    let ver = assemName.Version
    printfn $"Application {assemName.Name}, Version {ver}"
    
    Imports System.Reflection
    
    Module Example3
        Public Sub Main()
            ' Get the version of the executing assembly (that is, this assembly).
            Dim assem As Assembly = Assembly.GetEntryAssembly()
            Dim assemName As AssemblyName = assem.GetName()
            Dim ver As Version = assemName.Version
            Console.WriteLine("Application {0}, Version {1}", assemName.Name, ver.ToString())
        End Sub
    End Module
    
  • 检索当前程序集的程序集版本。 下面的示例使用 Type.Assembly 该属性获取对表示包含应用程序入口点的程序集的对象的引用 Assembly ,然后检索其版本信息。

    using System;
    using System.Reflection;
    
    public class Example3
    {
       public static void Main()
       {
          // Get the version of the current assembly.
          Assembly assem = typeof(Example).Assembly;
          AssemblyName assemName = assem.GetName();
          Version ver = assemName.Version;
          Console.WriteLine("{0}, Version {1}", assemName.Name, ver.ToString());
       }
    }
    
    type Example = class end
    
    // Get the version of the current assembly.
    let assem = typeof<Example>.Assembly
    let assemName = assem.GetName()
    let ver = assemName.Version
    printfn $"{assemName.Name}, Version {ver}"
    
    Imports System.Reflection
    
    Module Example1
        Public Sub Main()
            ' Get the version of the current assembly.
            Dim assem As Assembly = GetType(Example).Assembly
            Dim assemName As AssemblyName = assem.GetName()
            Dim ver As Version = assemName.Version
            Console.WriteLine("{0}, Version {1}", assemName.Name, ver.ToString())
        End Sub
    End Module
    
  • 检索特定程序集的版本。 下面的示例使用 Assembly.ReflectionOnlyLoadFrom 该方法获取对 Assembly 具有特定文件名的对象的引用,然后检索其版本信息。 请注意,还存在其他几种方法,以按文件名或强名称实例化 Assembly 对象。

    using System;
    using System.Reflection;
    
    public class Example5
    {
       public static void Main()
       {
          // Get the version of a specific assembly.
          string filename = @".\StringLibrary.dll";
          Assembly assem = Assembly.ReflectionOnlyLoadFrom(filename);
          AssemblyName assemName = assem.GetName();
          Version ver = assemName.Version;
          Console.WriteLine("{0}, Version {1}", assemName.Name, ver.ToString());
       }
    }
    
    open System.Reflection
    
    // Get the version of a specific assembly.
    let filename = @".\StringLibrary.dll"
    let assem = Assembly.ReflectionOnlyLoadFrom filename
    let assemName = assem.GetName()
    let ver = assemName.Version
    printfn $"{assemName.Name}, Version {ver}"
    
    Imports System.Reflection
    
    Module Example4
        Public Sub Main()
            ' Get the version of a specific assembly.
            Dim filename As String = ".\StringLibrary.dll"
            Dim assem As Assembly = Assembly.ReflectionOnlyLoadFrom(filename)
            Dim assemName As AssemblyName = assem.GetName()
            Dim ver As Version = assemName.Version
            Console.WriteLine("{0}, Version {1}", assemName.Name, ver.ToString())
        End Sub
    End Module
    
  • 检索 ClickOnce 应用程序的发布版本。 以下示例使用该 ApplicationDeployment.CurrentVersion 属性显示应用程序的发布版本。 请注意,其成功执行需要设置示例的应用程序标识。 Visual Studio 发布向导会自动处理此问题。

    using System;
    using System.Deployment.Application;
    
    public class Example
    {
       public static void Main()
       {
          Version ver = ApplicationDeployment.CurrentDeployment.CurrentVersion;
          Console.WriteLine("ClickOnce Publish Version: {0}", ver);
       }
    }
    
    Imports System.Deployment.Application
    
    Module Example0
        Public Sub Main()
            Dim ver As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion
            Console.WriteLine("ClickOnce Publish Version: {0}", ver)
        End Sub
    End Module
    

    重要

    ClickOnce 部署应用程序的发布版本完全独立于其程序集版本。

比较版本对象

可以使用该方法 CompareTo 来确定一个对象是早于、与另一个 Version 对象相同还是晚于第二 Version 个对象。 以下示例指示版本 2.1 高于版本 2.0。

Version v1 = new Version(2, 0);
Version v2 = new Version("2.1");
Console.Write("Version {0} is ", v1);
switch(v1.CompareTo(v2))
{
   case 0:
      Console.Write("the same as");
      break;
   case 1:
      Console.Write("later than");
      break;
   case -1:
      Console.Write("earlier than");
      break;
}
Console.WriteLine(" Version {0}.", v2);                  
// The example displays the following output:
//       Version 2.0 is earlier than Version 2.1.
open System

let v1 = Version(2, 0)
let v2 = Version "2.1"

printf $"Version {v1} is "

match v1.CompareTo v2 with
| 0 -> printf "the same as"
| 1 -> printf "later than"
| _ -> printf "earlier than"

printf $" Version {v2}."
// The example displays the following output:
//       Version 2.0 is earlier than Version 2.1.
Dim v1 As New Version(2,0)
Dim v2 As New Version("2.1")
Console.Write("Version {0} is ", v1)
Select Case v1.CompareTo(v2)
   Case 0
      Console.Write("the same as")
   Case 1
      Console.Write("later than")
   Case -1
      Console.Write("earlier than")
End Select
Console.WriteLine(" Version {0}.", v2)                  
' The example displays the following output:
'       Version 2.0 is earlier than Version 2.1.

要使两个版本相等,第一个 Version 对象的主版本、次要版本、内部版本号和修订号必须与第二 Version 个对象的版本相同。 如果对象的生成或修订号 Version 未定义,则该 Version 对象被视为早于 Version 其生成或修订号等于零的对象。 以下示例通过比较具有未定义版本组件的三 Version 个对象来说明这一点。

using System;

enum VersionTime {Earlier = -1, Same = 0, Later = 1 };

public class Example2
{
   public static void Main()
   {
      Version v1 = new Version(1, 1);
      Version v1a = new Version("1.1.0");
      ShowRelationship(v1, v1a);
      
      Version v1b = new Version(1, 1, 0, 0);
      ShowRelationship(v1b, v1a);
   }

   private static void ShowRelationship(Version v1, Version v2)
   {
      Console.WriteLine("Relationship of {0} to {1}: {2}", 
                        v1, v2, (VersionTime) v1.CompareTo(v2));       
   }
}
// The example displays the following output:
//       Relationship of 1.1 to 1.1.0: Earlier
//       Relationship of 1.1.0.0 to 1.1.0: Later
open System

type VersionTime =
    | Earlier = -1
    | Same = 0
    | Later = 1

let showRelationship (v1: Version) (v2: Version) =
    printfn $"Relationship of {v1} to {v2}: {v1.CompareTo v2 |> enum<VersionTime>}" 

let v1 = Version(1, 1)
let v1a = Version "1.1.0"
showRelationship v1 v1a

let v1b = Version(1, 1, 0, 0)
showRelationship v1b v1a

// The example displays the following output:
//       Relationship of 1.1 to 1.1.0: Earlier
//       Relationship of 1.1.0.0 to 1.1.0: Later
Public Enum VersionTime
   Earlier = -1
   Same = 0
   Later = 1
End Enum

Module Example2
    Public Sub Main()
        Dim v1 As New Version(1, 1)
        Dim v1a As New Version("1.1.0")
        ShowRelationship(v1, v1a)

        Dim v1b As New Version(1, 1, 0, 0)
        ShowRelationship(v1b, v1a)
    End Sub

    Private Sub ShowRelationship(v1 As Version, v2 As Version)
        Console.WriteLine("Relationship of {0} to {1}: {2}",
                        v1, v2, CType(v1.CompareTo(v2), VersionTime))
    End Sub
End Module
' The example displays the following output:
'       Relationship of 1.1 to 1.1.0: Earlier
'       Relationship of 1.1.0.0 to 1.1.0: Later