2009-08-08 10 views
31

Quiero ser capaz de mostrar la versión actual de una aplicación .NET que he implementado utilizando el asistente de publicación. Hay una buena opción para actualizar automáticamente el número de versión cada vez que publico mi aplicación.¿Cómo obtengo la versión publicada actual en una aplicación .NET?

me encontré con otra pregunta (Automatically update version number) que tenía esto para obtener la versión actual:

Assembly.GetExecutingAssembly().GetName().Version 

Esto se consigue la versión se establece en las propiedades del proyecto, pero no la versión que se incrementa automáticamente cada hora de publicar

+1

¿Se puede calificar la afirmación de que de alguna manera? GetExecutingAssembly(). GetName(). La versión funciona perfectamente en los ensamblados de versiones –

+1

Quizás quise decir publicar y no implementar. Puedo cambiar eso en la pregunta. Cuando ejecuto el asistente de publicación, automáticamente actualiza una versión de publicación. En el código se conoce como la versión Implementada. –

Respuesta

43

Terminé usando este pequeño código para obtener la versión implementada actual o si no se implementó la versión de ensamblado actual.

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

he tenido que añadir referencias a System.Deployment y System.Reflection.

+5

No tiene que usar ese bloque de try/catch pirateado. Puede verificar si su aplicación está implementada 'ApplicationDeployment.IsNetworkDeployed' –

+1

' ApplicationDeployment.IsNetworkDeployed' arroja una excepción si no se está ejecutando como una aplicación ClickOnce y el resultado puede ser el cierre de toda la aplicación. Desea la prueba de detección; de lo contrario, está perjudicando a los usuarios actuales y/o futuros. –

+0

Después de agregar ApplicationDeployment.IsNetworkDeployed, nunca volví a ver una excepción. Fue solo al acceder a la clase CurrentDeployment. –

46

Usted puede utilizar la siguiente prueba

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

para evitar la excepción (como se detalla en this post).

Además, no creo que pueda obtener la versión de publicación actual a través de la depuración de Visual Studio porque al acceder a CurrentDeployment lanzará un InvalidDeploymentException.

+3

Prefiero este método que la respuesta aceptada. La respuesta aceptada no hace distinción sobre qué excepción está manejando. En general, es una mala práctica hacer sweeping excepcionales controladores. – Daniel

+1

Del mismo modo. Tampoco revierte arbitrariamente a la versión de ensamblado; no es comparable a la versión de implementación, por lo que no debe usarse como alternativa. – Ashe

-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 
+2

-1 esto es lo mismo que la pregunta –

+0

No solo es la pregunta, sino que es importante tener en cuenta que esto toma la versión de la aplicación NO la versión de publicación.Lo tengo configurado para autoincrementarse en un Complemento de Excel, por lo que cada publicación sale 1.0.0.138 o algo similar, mientras que el código anterior devuelve 1.0.0.0 que se establece en la pestaña de propiedades. –

1

Con base en la respuesta de Jason, terminé con esto:

añadir una referencia a 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); 
} 

Espero que ayude.

2

utilicé siguiente solución para este problema, y ​​se está trabajando para mí:

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()); 
} 
+0

Upvote porque es simple y una operación ligera, mientras que, incluso MS no proporciona una buena manera de acceder a esto. –

Cuestiones relacionadas