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

37

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

我发现了另一个问题 (Automatically update version number),其中提到了获取当前版本的方法:

Assembly.GetExecutingAssembly().GetName().Version

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


1
你能否以某种方式证实这个说法?GetExecutingAssembly().GetName().Version 在发布程序集上可以正常工作。 - Sam Saffron
1
也许我想说的是发布而不是部署。我可以在问题中更改它。当我运行发布向导时,它会自动更新发布版本。在代码中,它被称为已部署版本。 - Ed Haber
6个回答

53

您可以使用以下测试

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

为了避免异常情况(详见此帖)。

另外,我认为你不能通过Visual Studio调试来获取当前的发布版本,因为访问CurrentDeployment将引发InvalidDeploymentException异常。


3
我更喜欢这种方法而不是接受的答案。接受的答案没有区分它处理的是哪个异常。将异常处理程序简单地应用于所有情况通常是不良实践。 - Daniel
1
同样地,它也不会随意返回汇编版本;它与部署版本不可比较,因此不应作为备用方案使用。 - Asherah

44

我最终使用了这段小代码来获取当前已部署的版本或者如果没有部署,则获取当前程序集版本。

private Version GetRunningVersion()
{
  try
  {
    return Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;
  }
  catch
  {
    return Assembly.GetExecutingAssembly().GetName().Version;
  }
}

我不得不添加对System.DeploymentSystem.Reflection的引用。


6
不必使用那个粗略的try/catch代码块。你可以检查你的应用程序是否已部署,使用"ApplicationDeployment.IsNetworkDeployed"方法。 - The Muffin Man
1
如果ApplicationDeployment.IsNetworkDeployed没有以ClickOnce应用程序的形式运行,它会抛出一个异常,结果可能会导致整个应用程序关闭。你需要使用 try-catch - 否则你对当前和/或未来的用户是不负责任的。 - Peter Mortensen
在添加了ApplicationDeployment.IsNetworkDeployed之后,我再也没有看到过异常。只有在访问CurrentDeployment类时才会出现。 - Anthony Mason

3
我用了以下的解决方案来解决这个问题,它对我很有效:
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());
}

1
点赞因为它简单且操作轻便,而即使是微软也没有提供一个好的访问方式。 - Anthony Mason

2

根据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);
}

希望这能帮到你。

0
using System.Deployment.Application;

并且

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

值得注意的是,在本地运行时需要检查 ApplicationDeployment.IsNetworkDeployed,否则 ApplicationDeployment.CurrentDeployment 会抛出异常。 - Michal Ciechan

-1
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

1
不仅是这个问题,而且需要注意的是,这会获取应用程序版本而不是发布版本。我已经将其设置为在Excel AddIn上自动递增,因此每次发布都会以1.0.0.138或类似的形式出现,而上面的代码返回的是在属性选项卡下设置的1.0.0.0。 - Anthony Mason

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