如何在C#中获取当前产品版本?

71
我该如何在C#中以编程的方式获取当前产品版本号?
我的代码:
VersionNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

我得到的版本号是1.0.0.0,但当前版本是1.0.0.12。


2
查看 System.Reflection.Assembly.GetExecutingAssembly().GetName() 返回了什么。 - Haris Hasan
另外,您是在寻找程序集版本还是实际上在寻找 ClickOnce 应用程序版本? - Peter Lillevold
1
当前版本为1.0.0.12 - 设置在哪里?在资源管理器中以平铺视图或属性方式查看文件版本。 - Rup
你是想读取“程序集版本”还是“程序集文件版本”?- 在Visual Studio的解决方案资源管理器中查看<您的项目>\Properties\AssemblyInfo.cs。 - Danny Varod
不行,这可以在两行代码中完成,这就是我以前所做的。我想要的是生产版本,也就是部署版本,而不是程序集文件版本。 - Nivid Dholakia
10个回答

114

有三个版本:程序集、文件和产品。要获取产品版本:

using System.Reflection;
using System.Diagnostics;
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fileVersionInfo.ProductVersion;

6
在项目属性中,两个旁边的版本设置看起来很相似,但实际上在内部它们属于不同的类,这真是太荒谬了。甚至这两个类中的属性也不相同;在程序集版本中,最后一部分被称为“修订版”,而在文件版本中被称为“私有”。请注意,我已经尽力使翻译简明扼要,保留了原文意思并尽量易懂。 - Nyerguds
当我升级到使用单文件打包的.NET 6.0版本时,似乎无法使用此功能。 - Anduin Xue

34

我已经得到了我的问题的答案,只需提供 System.Deployment.Application 的引用即可。虽然在 Visual Studio 的开发中它不起作用,但在应用程序部署后它将起作用。

//using System.Deployment.Application;
//using System.Reflection;
public string CurrentVersion
{
    get
    {
        return ApplicationDeployment.IsNetworkDeployed
               ? ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString()
               : Assembly.GetExecutingAssembly().GetName().Version.ToString();
    }
} 

6
这不是“产品版本”,而是“文件版本”。 - jpmc26

20
System.Reflection.Assembly.GetEntryAssembly().GetName().Version

GetEntryAssembly是获取正在运行的应用程序的关键点,即使代码在DLL程序集中也可以获取。 - Carlos Liu
这不是生产版本。产品版本是一个以字符串表示的版本,因此能够以SemVer格式存储版本信息。 - stoj

19

获取产品版本的另一种方法(该版本使用 AssemblyInformationalVersionAttribute 指定)是:

private static string AssemblyProductVersion
{
    get
    {
        object[] attributes = Assembly.GetExecutingAssembly()
            .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
        return attributes.Length == 0 ?
            "" :
            ((AssemblyInformationalVersionAttribute)attributes[0]).InformationalVersion;
    }
}

1
这种情况下最好使用(例如 SqlClr)无法访问文件系统的情况。 - rrreee

6

试试这个:

var thisApp = Assembly.GetExecutingAssembly();
AssemblyName name = new AssemblyName(thisApp.FullName);
VersionNumber = "v. " + name.Version;

此外,参见Microsoft Doc关于AssemblyName.Version属性的介绍。


那是程序集版本号还是程序集文件版本号? - Glenn Ferrie
实际上,我需要我们正在构建的应用程序的当前版本。那么我该如何获取它?就是我们在解决方案属性中拥有的相同版本。 - Nivid Dholakia
1
我正在使用MVVM模式,并且它给我提供了视图模型的版本号。 - Nivid Dholakia
1
那不是产品版本号,而是文件版本号,它们并不相同。 - masm64

6
在C#中,您需要使用反射和诊断技术。
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fileVersionInfo.ProductVersion;

1
如果您使用网络部署版本或使用其他项目作为启动项目,则此方法无法正常工作。 - Nivid Dholakia

4

所有这些答案都要求使用.GetExecutingAssembly()来获取程序集。

如果你在dll中使用此代码,则会返回dll的版本号。

将该调用替换为GetCallingAssembly(),以获取需要知道的代码位置。

/// <summary>
/// Returns version like 2.1.15
/// </summary>
public static String ProductVersion
{
    get
    {
        return new Version(FileVersionInfo.GetVersionInfo(Assembly.GetCallingAssembly().Location).ProductVersion).ToString();
    }
}

3
var productVersion = FileVersionInfo.GetVersionInfo(typeof(SomeClassFromDesiredAssembly).Assembly.Location).ProductVersion;

4
请您能否提供一份解释,以便其他人能够理解您的代码以及它是如何解决问题的? - Kevin

2
我和大多数人一样遇到了同样的问题。除非您手动更新assemblyInfo.cs中要显示的版本,否则它总是显示1.0.0.0。我认为我们想在项目属性下显示发布版本-修订号,但这似乎不是一个选项(根据我所读的)。我不确定当时发表这些评论时是否存在这种情况,但现在在assemblyinfo.cs中有一种自动完成此操作的方法。我也不满意每次发布都要手动更新这些内容。
// 您可以指定所有值,也可以使用以下示例中显示的'*'默认生成和修订号: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.*")]
那个*会随着每次发布而自动增加。它不会与您在项目属性下看到的发布号相同,但它肯定会增加,而且绝对比手动更好。然后,您有几个选项可以按上面提到的方式显示它。我个人使用了在另一个网站上找到的这个:
Version version = Assembly.GetExecutingAssembly().GetName().Version; lblRevision.Text = String.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);

这样做意味着当您更改主版本或次版本时,只需要更新assemblyInfo.cs,因为构建和修订已经为您处理了。更改发布版本不会影响此操作。 - blind Skwirl

0
最简单的方法是不用处理装配位置。
Assembly someAssembly = ...;
var productVersion = someAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接