2013-04-05 12 views
6

È possibile ottenere la versione del file di exe (la propria versione) in vb6 utilizzando App.Major, App.Minor, App.Revision ecc. Ma come posso ottenere lo stesso in vb.net. Ho provato a utilizzare i seguenti 3 metodi.Get file version

Text1.Text = My.Application.Info.Version.Major & "." & My.Application.Info.Version.Minor & "." & My.Application.Info.Version.Build & "." & My.Application.Info.Version.Revision 

Text2.Text = Me.GetType.Assembly.GetName.Version.ToString() 

Text3.Text = My.Application.Info.Version.ToString() 

In tutti i 3 casi tornava assemblaggio versione (ho controllato nella cartella bin dove l'exe creato in un xp dispositivo automatico di Windows 8 non ho visto alcuna opzione come versione di montaggio quando vedo le proprietà dei file)

Per impostazione predefinita, le versioni sia di assemblaggio che di file sono uguali. Ma quando l'ho modificata manualmente in project properties->applicationassembly information->File version, sono venuto a sapere che il mio codice sta restituendo la versione dell'assembly. Quindi, come posso ottenere la versione del file? Cos'è il vesrion di assemblaggio e file?

risposta

2

Usa FileVersionInfo.GetVersionInfo, ad esempio:

Dim myFileVersionInfo As FileVersionInfo = 
    FileVersionInfo.GetVersionInfo([Assembly].GetExecutingAssembly().Location) 
+0

quando provo quel codice, ottengo un errore: 'Assembly' è un tipo in 'Reflection' e non può essere usato come espressione. :(questo codice non funziona, intendevi sostituire "[Assembly]" nel codice sorgente con qualcos'altro? –

+0

non importa, ho funzionato, ho pubblicato la mia soluzione con il codice sorgente. Grazie Martin per avermi condotto risposta –

1

Il modo più semplice per ottenere la versione dell'applicazione è questo:

My.Application.Info.Version.Major 
    My.Application.Info.Version.MajorRevision 

ecc

un'occhiata a questo articolo per una descrizione delle assemblee : http://visualbasic.about.com/od/FWTools/a/FWAssemblies.htm Come informazioni qucik: un assembly può contenere più file, quindi gli assemblatori lo ione è migliore delle informazioni del file.

+0

errata, c'è una grande differenza tra la versione di assieme e la versione del file (di assieme) –

+0

Quando eseguo My.Application.Info.Version da una DLL ottengo le informazioni dell'EXE Per ottenere la "Versione file" della DLL, dall'interno la DLL stessa, ho bisogno del codice di Shawn ... Qualcosa come ... FileVersionInfo.GetVersionInfo (Assembly.GetExecutingAssembly(). Posizione) .FileVersion – Rose

+0

Anche questo non funzionerà con le librerie di classi poiché l'oggetto My.Application non esiste. –

3

quindi nei programmi .NET, ci sono davvero due versioni, non solo una (di cui sono a conoscenza). la versione Assembly è ciò che stai catturando ed è più facile da recuperare in .NET. È essenzialmente "la versione di .NET", quindi quando gli assembly hanno versioni diverse, è quella che usa.

quindi c'è la "Versione file" o in un punto che vedo Microsoft ha anche chiamato "Versione file di assembly" per rendere la confusione ancora peggiore. quindi è davvero necessario vedere se il nome include "file" o meno. questa versione "File" per un assembly è associata al file system, quindi quando si guarda la versione in Windows Explorer, questo è ciò che si otterrà.

perché Microsoft ha diviso quelle due cose diverse e non le ha unite, non capisco. forse qualcuno può illuminarmi ulteriormente.

ho appena capito il codice per prendere la versione di File. ho trovato questa domanda perché stavo cercando come recuperarla (in VB, non in C#). Penso che C# faciliti la maggior parte delle cose, incluso l'accesso all'Assemblea. Quindi, ecco il codice VB per recuperare il file versione del programma:

Dim fileName$ = System.Reflection.Assembly.GetExecutingAssembly().Location 
Dim fileName2$ = Application.ExecutablePath ' this grabs the filename too, 
' but #2 ends with ".EXE" while the 1st ends with ".exe" in my Windows 7. 

' either fileName or fileName2 works for me. 
Dim fvi As FileVersionInfo = FileVersionInfo.GetVersionInfo(fileName) 
' now this fvi has all the properties for the FileVersion information. 
Dim fvAsString$ = fvi.FileVersion ' but other useful properties exist too. 

wow, un sacco di codice per qualcosa che dovrebbe essere qualcosa di semplice come lo era in VB6. Forse anche App.Version.ToString o qualcosa del genere. Wow. strada da percorrere, Microsoft! almeno questo non è difficile come alcune delle loro acrobazie, come se stessi suonando la tua musica.

+0

Questa "Versione file" non fa parte del file system, ma parte del formato del file: Esplora risorse apre la pubblicità del file e legge la versione dal contenuto del file, non dal file system – Zrin

+0

@ Zin, apprezzo la tua correzione. sai dove posso verificare la tua correzione per vedere di persona che questo è davvero il caso? –

+0

Cerca "exe file version info" - I file EXE ("PE") hanno campi di informazioni sulla versione e possono anche contenere un blocco "versioninfo". : Gli assembly NET hanno proprie informazioni sulla versione incorporata e molte più informazioni sulla meta. "Codice gestito" ... Se si trattasse di una funzione di file system, sarebbe possibile impostare le informazioni sulla versione per qualsiasi file, anche un semplice file di testo. – Zrin

2

realtà prendendo Shawns risposta e migliorarla un po 'è possibile recuperare la versione del file con una sola riga di codice

Dim FileVer As String = FileVersionInfo.GetVersionInfo(Application.ExecutablePath).FileVersion 

o è possibile inserirlo in un'etichetta

Me.Label1.Text = FileVersionInfo.GetVersionInfo(Application.ExecutablePath).FileVersion 

Strada da percorrere ! VB.NET semplice come al solito ....

0

Quello che segue è un modo più affidabile di ottenere dell'assemblea informazioni sulla versione del file dal all'interno del gruppo stesso:

Function GetAssemblyFileVersion() As String 
    Dim ProjectAssembly As Reflection.Assembly 
    ProjectAssembly = Reflection.Assembly.GetExecutingAssembly() 

    For Each attr As Attribute In ProjectAssembly.GetCustomAttributes(False) 
     If TypeOf attr Is Reflection.AssemblyFileVersionAttribute Then 
      Dim FileVerAttr As Reflection.AssemblyFileVersionAttribute = attr 
      Return FileVerAttr.Version 
     End If 
    Next 

    Throw New Reflection.TargetInvocationException(
     New KeyNotFoundException(
      "Cannot find custom attribute 'AssemblyFileVersionAttribute'")) 
End Function 
0

Si tratta di un metodo di estensione che ho creato per restituire il AssemblyFileVersion. Questo metodo funzionerà per applicazioni e librerie di classi.

''' <summary> 
''' Gets the AssemblyFileVersion from the specified assembly. 
''' </summary> 
''' <param name="Assembly">[Assembly] Assembly to get the Assembly File Version from.</param> 
''' <returns>[String] The Assembly's file version.</returns> 
<Extension> 
Friend Function GetFileVersion(ByVal Assembly As Assembly) As String 
    On Error GoTo Err 
    Return DirectCast(Assembly.GetCustomAttribute(GetType(AssemblyFileVersionAttribute)), AssemblyFileVersionAttribute).Version 
Err: 
    Return Nothing 
End Function 

Ricordate, Extension Methods bisogno di essere collocato in un Module, non possono essere creati in un Class. Se vuoi saperne di più su Extension Methods digita nella barra di ricerca sopra. Ti renderanno la vita più facile. ;)

assicurarsi di includere quanto segue nel modulo ...

Imports System.Runtime.CompilerServices 

Ora in qualsiasi assieme si può semplicemente chiamare qualcosa di simile.

Dim Version as String = AnyAssembly.GetFileVersion() 
0

Sono bruciato ma hai provato Application.ProductVersion? Non lo vedo nelle altre domande. Ciò restituirà x.x.x.x qualunque versione sia presente nelle impostazioni del progetto. Si noti che per clickonce è necessario scaricarlo da un altro sito.

Problemi correlati