如何在 .NET 应用程序中获取当前发布的版本?

Posted

技术标签:

【中文标题】如何在 .NET 应用程序中获取当前发布的版本?【英文标题】:How do I get the current published version in a .NET application? 【发布时间】:2010-11-17 22:36:50 【问题描述】:

我希望能够显示我使用发布向导部署的 .NET 应用程序的当前版本。有一个不错的选项可以在我每次发布应用程序时自动更新版本号。

我发现另一个问题 (Automatically update version number) 有这个获得当前版本:

Assembly.GetExecutingAssembly().GetName().Version

这将为您获取您在项目属性中设置的版本,但不是每次发布时自动递增的版本。

【问题讨论】:

你能以某种方式限定这个断言吗? GetExecutingAssembly().GetName().Version 在发布程序集上工作得很好 也许我的意思是发布而不是部署。我可以去改变这个问题。当我运行发布向导时,它会自动更新发布版本。在代码中它被称为部署版本。 【参考方案1】:

你可以使用下面的测试

if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) 
    return System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;

避免异常(详见this post)。

另外,我认为您无法通过 Visual Studio 调试获得当前发布版本,因为访问 CurrentDeployment 会抛出 InvalidDeploymentException

【讨论】:

我更喜欢这种方法而不是接受的答案。接受的答案不区分它正在处理的异常。制作全面的异常处理程序通常是不好的做法。 同样。它也不会任意恢复到汇编版本;它无法与部署版本相提并论,因此不应将其用作后备版本。【参考方案2】:

我最终使用这一点代码来获取当前部署的版本,或者如果它没有部署当前的程序集版本。

private Version GetRunningVersion()

  try
  
    return Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;
  
  catch
  
    return Assembly.GetExecutingAssembly().GetName().Version;
  

我必须添加对System.DeploymentSystem.Reflection 的引用。

【讨论】:

您不必使用那种骇人听闻的 try/catch 块。您可以检查您的应用是否已部署ApplicationDeployment.IsNetworkDeployed 如果 ApplicationDeployment.IsNetworkDeployed 未作为 ClickOnce 应用程序运行并且结果可能会关闭整个应用程序,则会引发异常。您确实想要 try-catch - 否则您正在对当前和/或未来的用户造成伤害。 添加 ApplicationDeployment.IsNetworkDeployed 后,我再也没有看到异常。仅在访问 CurrentDeployment 类时。【参考方案3】:

根据 Jason 的回答,我得出了这样的结论:

添加对 System.Deployment 的引用。

string versionDeploy = Application.ProductVersion;              
if (System.Diagnostics.Debugger.IsAttached)

    this.lblVersion.Caption = string.Format("Versión 0 DESA", versionDeploy);

else

    if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
    
        Version Deploy = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;
        versionDeploy = string.Format("0.1.2.3", Deploy.Major, Deploy.Minor, Deploy.Build, Deploy.Revision);
    
    this.lblVersion.Caption = string.Format("Versión 0 PROD", versionDeploy);

希望对你有帮助。

【讨论】:

【参考方案4】:

我为这个问题使用了以下解决方案,它对我有用:

DataSet ds = new DataSet();
ds.ReadXml(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "MyProd.application"));
DataTable dt = new DataTable();
if (ds.Tables.Count > 1) 
    dt = ds.Tables[1];
    MessageBox.Show(dt.Rows[0]["version"].ToString());

【讨论】:

赞成,因为它简单且操作轻巧,然而,即使是 MS 也没有提供访问它的好方法。【参考方案5】:
using System.Deployment.Application;

string yourPublishedVersionNumber=ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString()

【讨论】:

在本地运行时值得检查ApplicationDeployment.IsNetworkDeployed,否则ApplicationDeployment.CurrentDeployment 会引发异常【参考方案6】:
Imports System.Configuration
Public Function GetAppVersion() As String
    Dim ass As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
    Dim ver As System.Version = ass.GetName().Version
    Return ver.Major & "." & ver.Minor & "." & ver.Revision
End Function

【讨论】:

这不仅是个问题,而且重要的是要注意,这会获取应用程序版本而不是发布版本。我将它设置为在 Excel 插件上自动递增,因此每次发布都会出现 1.0.0.138 或类似的内容,而上面的代码返回 1.0.0.0,这是在属性选项卡下设置的。

以上是关于如何在 .NET 应用程序中获取当前发布的版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET Core 中获取 Docker 版本

应用当前版本被拒后如何提交应用审核?

如何使用 SpotifyAPI-NET 获取当前正在播放的歌曲

如何在 ASP.NET MVC 中获取当前用户

.NET Core 当前版本

如何在asp.net core中获取当前用户