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

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

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

Assembly.GetExecutingAssembly().GetName().Version

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

【问题讨论】:

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

标签: c# .net


【解决方案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,这是在属性选项卡下设置的。
    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2011-04-26
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多