Jak mogę uzyskać wersję pliku zespołu

727

W AssemblyInfoistnieją dwie wersje montażowe:

  1. AssemblyVersion: Określ wersję przypisywanego zestawu.
  2. AssemblyFileVersion: Nakazuje kompilatorowi użycie określonego numeru wersji dla zasobu wersji pliku Win32. Wersja pliku Win32 nie musi być taka sama jak numer wersji zestawu.

Mogę uzyskać Assembly Versionnastępujący wiersz kodu:

Version version = Assembly.GetEntryAssembly().GetName().Version;

Ale jak mogę uzyskać Assembly File Version?

Enyra
źródło
2
Co rozumiesz przez „wersję pliku zespołu”, a nie „wersję zestawu”? Czy możesz podać przykład?
Xiaofu
7
@Xiaofu - „Wersja wersji” jest tym, czego .NET używa wewnętrznie. „Wersja pliku zespołu” jest wyświetlana po kliknięciu pliku prawym przyciskiem myszy i przejściu do „właściwości”, a następnie karty „Szczegóły”. One nie są takie same.
rory.ap
Odkryłem, że wersja zestawu jest używana podczas określania lokalizacji user.config w AppData.
Kyle Delaney

Odpowiedzi:

867

Zobacz mój komentarz powyżej z prośbą o wyjaśnienie, czego naprawdę chcesz. Mam nadzieję, że to jest to:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
Xiaofu
źródło
4
@Xiaofu: Czy istnieje sposób na uzyskanie numerów wersji z pliku AssemblyInfo.cs?
Markus
56
Jednym z problemów z tym kodem jest to, że faktycznie zwróci 1.0. *. *, Jeśli nie określiłeś numerów kompilacji i wersji. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); dostaniesz „skompilowany” numer wersji - który powinien być taki sam jak FileVersion, jeśli ustawiasz obie wersje w ten sam sposób.
Doguhan Uluca
17
@DoguhanUluca Są to dwie różne rzeczy. To da ci wersję zestawu, a nie wersję pliku. „Jeśli ustawiasz obie wersje w ten sam sposób” to obejście, a nie rozwiązanie.
Nyerguds
1
Czy FileVersionInfoma tylko stringwłaściwości, a nie Versionwłaściwości?
Kyle Delaney
3
@Yitzchak: Assembly.GetEntryAssembly()zwraca NULL na przykład w kontekście dodatków Office, a także w wielu innych przypadkach. Ponadto, jeśli myślisz o dodatkach / wtyczkach - EntryAssembly jest aplikacją hosta, a najczęściej chcesz wersji YourCode (TM) :) Poza tym warto dodać do tej odpowiedzi, która assembly.Locationzastosowana w odpowiedzi może być również zerowa (tj. pierwszy przypadek wylogowany z Google: github.com/Azure/azure-functions-host/issues/1233 ) i to prawdopodobnie zdarza się nawet częściej niż po zgromadzeniu zerowego wpisu.
quetzalcoatl
209

Istnieją trzy wersje : montaż , plik i produkt . Są używane przez różne funkcje i przyjmują różne wartości domyślne, jeśli ich nie określisz.

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
Check6
źródło
17
Gdy pewnego dnia ten blog znika, tutaj jest sprowadzany w celach informacyjnych:string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
JMD
3
A dla tych, którzy chcą podać je w pliku AssemblyInfo.cs, do zestawu assemblyVersion (z dowolnymi liczbami, które chcesz) === [assembly: AssemblyVersion("2.0.*")]do pliku fileVersion użyj === [assembly: AssemblyFileVersion("2.0.*")]i dla produktuVersion === [assembly: AssemblyInformationalVersion("2.0.*")] Ostatni może wymagać przyrostka łańcucha w celu zachowania SemVerzgodności:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm,
Dodatek: AssemblyFileVersionnie może używać *notacji z przyrostkiem. :( Wymaga wszystkich czterech liczb.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm,
66

Kiedy chcę uzyskać dostęp do wersji pliku aplikacji (co jest ustawione w Informacje o zestawie -> Wersja pliku), powiedzmy, aby ustawić tekst etykiety przy ładowaniu formularza, aby wyświetlić wersję, właśnie użyłem

versionlabel.Text = "Version " + Application.ProductVersion;
syntap
źródło
53
Zauważ, że wymaga to odwołania do System.Windows.Forms, dlatego może nie być odpowiednie dla wszystkich aplikacji.
BradleyDotNET
2
Niestety, to jest struna. Nie jest to idealne rozwiązanie, jeśli chcesz sformatować go do prostszego formatu „v1.08”. Dużo bardziej przydatne, jeśli faktycznie dostajesz obiekt wersji, aby uzyskać podskładniki jako liczby całkowite.
Nyerguds
1
Również to pobiera AssemblyFileVersion z AssemblyInfo, a nie AssemblyVersion, więc uważaj
dario_ramos
Czy użytkownik z wysokim przedstawicielem może edytować tę odpowiedź, aby wyjaśnić, że dotyczy ona tylko formularzy Windows?
jrh 15.09.17
Właśnie tego szukałem, dzięki za odpowiedź!
David Refoua
23

AKTUALIZACJA: Jak wspomniał Richard Grimes w moim cytowanym poście , @Iain i @Dmitry Lobanov, moja odpowiedź jest poprawna teoretycznie, ale błędna w praktyce.

Jak powinienem pamiętać z niezliczonych książek itp., Podczas gdy ustawia się te właściwości za pomocą [assembly: XXXAttribute], zostają one przechwycone przez kompilator i umieszczone w VERSIONINFOzasobie.

Z powyższego powodu musisz zastosować podejście w odpowiedzi @ Xiaofu, ponieważ atrybuty są usuwane po wydobyciu z nich sygnału.


publiczny ciąg statyczny GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) Zestaw
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true)
    .Pojedynczy();
   return attribute.InformationalVersion;
}

(Od http://bytes.com/groups/net/420417-assemblyversionattribute - jak wspomniano tam, jeśli szukasz innego atrybutu, zastąp go powyższym)

Ruben Bartelink
źródło
Cześć Ruben, 2 notatki. Po pierwsze, pytanie zadane dla AssemblyFileVersion nie AssemblyVersion. Po drugie, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) zwraca tablicę o długości 0. Myślę, że dzieje się tak, ponieważ AssemblyVersionAttribute nie jest atrybutem niestandardowym.
Iain
Odnośnie pierwszego punktu, dlatego powiedziałem „jeśli szukasz innego atrybutu, zastąp to powyższym” (IIRC nie wypróbowałem go). Co do drugiego, wydaje się to prawdopodobne, ale nie mam czasu na kopanie ...
Ruben Bartelink,
Tak, tak naprawdę nie można uzyskać atrybutu AssemblyVersion za pośrednictwem .GetCustomAttribute (), wersję zestawu można pobrać AssemblyName.Versiontylko za pośrednictwem właściwości. Ale z każdym innym atrybutem jest to właściwy sposób
Dmitrii Lobanov
@DmitryLobanov i Iain Thanks za podpowiedzi. Mam nadzieję, że edycja obejmuje go na tyle, aby odpowiedź była warta zachowania zamiast usuwania - daj mi znać!
Ruben Bartelink
1
Użyłem AssemblyInformationalVersionAttributezamiast AssemblyVersionAttribute.net core 3.1
Vasya Milovidov
5

Użyj tego:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

Albo to:

new Version(System.Windows.Forms.Application.ProductVersion);
Pieter Geerkens
źródło