2009-08-08 15 views
31

Desidero poter visualizzare la versione corrente di un'applicazione .NET che ho distribuito utilizzando la procedura guidata di pubblicazione. C'è una buona opzione per aggiornare automaticamente il numero di versione ogni volta che pubblico la mia applicazione.Come si ottiene la versione pubblicata corrente in un'applicazione .NET?

ho trovato un'altra domanda (Automatically update version number) che ha avuto questo per ottenere la versione corrente:

Assembly.GetExecutingAssembly().GetName().Version 

In questo modo si ottiene la versione impostate nelle proprietà del progetto, ma non la versione che viene incrementato automaticamente ogni tempo che pubblichi.

+1

Potete qualificare tale affermazione in qualche modo? GetExecutingAssembly(). GetName(). La versione funziona perfettamente sugli assembly di versione –

+1

Forse intendevo pubblicare e non distribuire. Posso andare a cambiarlo nella domanda. Quando eseguo la procedura guidata di pubblicazione, aggiorna automaticamente una versione di pubblicazione. Nel codice viene indicato come la versione distribuita. –

risposta

43

Ho finito per utilizzare questo piccolo bit di codice per ottenere la versione distribuita corrente o se non è stata distribuita la versione corrente dell'assembly.

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

ho dovuto aggiungere i riferimenti a System.Deployment e System.Reflection.

+5

Non è necessario utilizzare quel blocco di prova/catch di hackish. È possibile verificare se la propria app è distribuita 'ApplicationDeployment.IsNetworkDeployed' –

+1

' ApplicationDeployment.IsNetworkDeployed' genera un'eccezione se non è in esecuzione come un'applicazione ClickOnce e il risultato potrebbe essere la chiusura dell'intera applicazione. Tu vuoi il try-catch, altrimenti stai facendo un cattivo servizio agli utenti attuali e/o futuri. –

+0

Dopo aver aggiunto ApplicationDeployment.IsNetworkDeployed, non ho mai più visto un'eccezione. Era solo quando si accede alla classe CurrentDeployment. –

46

È possibile utilizzare il seguente test

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

per evitare l'eccezione (come dettagliato nella this post).

Inoltre, non penso che sia possibile ottenere la versione di pubblicazione corrente tramite il debug di Visual Studio perché l'accesso a CurrentDeployment genererà un valore InvalidDeploymentException.

+3

Preferisco questo metodo rispetto alla risposta accettata. La risposta accettata non fa alcuna distinzione su quale eccezione stia gestendo. In generale, è una cattiva pratica rendere i gestori di eccezioni radicali. – Daniel

+1

Allo stesso modo. Inoltre non ritorna arbitrariamente alla versione dell'assembly; non è paragonabile alla versione di implementazione, quindi non dovrebbe essere usato come fallback. – 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 equivale alla domanda –

+0

Non solo è la domanda, ma è importante notare che questo richiama la versione dell'applicazione NON la versione di pubblicazione.Ho impostato l'auto-incremento su un AddIn di Excel, quindi ogni pubblicazione viene rilasciata 1.0.0.138 o qualcosa di simile mentre il codice precedente restituisce 1.0.0.0 che è impostato nella scheda delle proprietà. –

1

sede nella risposta da Jason, ho finito con questo:

Aggiungi riferimento per 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); 
} 

Spero che sia d'aiuto.

2

ho usato seguente soluzione per questo problema, e si sta lavorando per me:

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 perché è un'operazione semplice e leggera, mentre anche MS non offre un buon modo per accedervi. –

Problemi correlati