如何在 .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.Deployment
和System.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 应用程序中获取当前发布的版本?的主要内容,如果未能解决你的问题,请参考以下文章