Wie kann ich die Assembly-Dateiversion erhalten?


727

Es AssemblyInfogibt zwei Baugruppenversionen:

  1. AssemblyVersion: Geben Sie die Version der Assembly an, die zugeordnet werden soll.
  2. AssemblyFileVersion: Weist einen Compiler an, eine bestimmte Versionsnummer für die Win32-Dateiversionsressource zu verwenden. Die Win32-Dateiversion muss nicht mit der Versionsnummer der Assembly übereinstimmen.

Ich kann das Assembly Versionmit der folgenden Codezeile bekommen:

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

Aber wie kann ich das bekommen Assembly File Version?


2
Was meinen Sie mit "Assembly-Dateiversion" im Gegensatz zu "Assembly-Version"? Kannst du ein Beispiel geben?
Xiaofu

7
@ Xiaofu - "Assembly Version" wird von .NET intern verwendet. "Assembly File Version" wird angezeigt, wenn Sie mit der rechten Maustaste auf eine Datei klicken und zu "Eigenschaften" und dann zur Registerkarte "Details" wechseln. Sie sind nicht gleich.
rory.ap

Ich habe festgestellt, dass die Assembly-Version verwendet wird, um den Speicherort user.config in AppData zu bestimmen.
Kyle Delaney

Antworten:


867

Siehe meinen Kommentar oben und bitte um Klarstellung, was Sie wirklich wollen. Hoffentlich ist es das:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

4
@ Xiaofu: Gibt es eine Möglichkeit, die Versionsnummern stattdessen aus einer AssemblyInfo.cs-Datei abzurufen?
Markus

56
Ein Problem mit diesem Code ist, dass er tatsächlich 1.0. *. * Zurückgibt, wenn Sie keine Build- und Revisionsnummern angegeben haben. AssemblyName.GetAssemblyName (Assembly.Location) .Version.ToString (); Sie erhalten die 'kompilierte' Versionsnummer, die mit FileVersion identisch sein sollte, wenn Sie beide Versionen auf die gleiche Weise einstellen.
Doguhan Uluca

17
@ DoguhanUluca Das sind zwei verschiedene Dinge. Das gibt Ihnen die Assembly-Version, nicht die Dateiversion. "Wenn Sie beide Versionen auf die gleiche Weise einstellen" ist eine Problemumgehung und keine Lösung.
Nyerguds

1
Hat FileVersionInfonur stringEigenschaften und keine VersionEigenschaften?
Kyle Delaney

3
@Yitzchak: Gibt Assembly.GetEntryAssembly()NULL zurück, beispielsweise im Kontext von Office-Add-Ins und auch in vielen anderen Fällen. Wenn Sie an Addins / Plugins denken, ist EntryAssembly die Host-Anwendung, und meistens möchten Sie die Version von YourCode (TM) :) Abgesehen davon lohnt es sich, diese Antwort zu ergänzen, assembly.Locationdie in der Antwort ebenfalls null sein kann (dh der erste zufällige Fall wurde gegoogelt: github.com/Azure/azure-functions-host/issues/1233 ) und das passiert wahrscheinlich noch häufiger als eine Null-Eintrags-Assembly.
Quetzalcoatl

209

Es gibt drei Versionen : Assembly , Datei und Produkt . Sie werden von verschiedenen Funktionen verwendet und nehmen unterschiedliche Standardwerte an, wenn Sie sie nicht explizit angeben.

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;

17
Wenn dieser Blog-Beitrag eines Tages verschwindet, wird er hier als Referenz zusammengefasst: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
Und für diejenigen, die diese in der Datei AssemblyInfo.cs angeben möchten, für die Verwendung von AssemblyVersion (mit beliebigen Nummern) === [assembly: AssemblyVersion("2.0.*")]für die Verwendung von fileVersion === [assembly: AssemblyFileVersion("2.0.*")]und für die Verwendung von productVersion === [assembly: AssemblyInformationalVersion("2.0.*")] Die letzte kann aus SemVerKompatibilitätsgründen das Zeichenfolgensuffix verwenden :[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm

Nachtrag: AssemblyFileVersionMöglicherweise wird die *Suffixnotation nicht verwendet. :( Es braucht alle vier Zahlen.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm

66

Wenn ich auf die Anwendungsdateiversion zugreifen möchte (was unter Baugruppeninformationen -> Dateiversion festgelegt ist), z. B. um beim Laden des Formulars den Text eines Etiketts festzulegen, um die Version anzuzeigen, die ich gerade verwendet habe

versionlabel.Text = "Version " + Application.ProductVersion;

53
Beachten Sie, dass hierfür ein Verweis auf System.Windows.Forms erforderlich ist und daher möglicherweise nicht für alle Anwendungen geeignet ist.
BradleyDotNET

2
Leider ist das eine Saite. Nicht ideal, wenn Sie es selbst in ein einfacheres "v1.08" -Format formatieren möchten. Viel praktischer, wenn Sie tatsächlich das Versionsobjekt erhalten, von dem die Unterkomponenten als Ganzzahlen abgerufen werden.
Nyerguds

1
Dies nimmt auch AssemblyFileVersion von AssemblyInfo, nicht AssemblyVersion, also
aufgepasst

Könnte ein Benutzer mit hohen Wiederholungszahlen diese Antwort bearbeiten, um klarer zu machen, dass dies nur für Windows Forms gilt?
jrh

Genau das habe ich gesucht, danke für die Antwort!
David Refoua

23

UPDATE: Wie von Richard Grimes in meinem zitierten Beitrag @Iain und @Dmitry Lobanov erwähnt, ist meine Antwort theoretisch richtig, in der Praxis jedoch falsch.

Wie ich mich aus unzähligen Büchern usw. hätte erinnern sollen, werden diese Eigenschaften [assembly: XXXAttribute]vom Compiler hochgesteckt und in die VERSIONINFORessource gestellt , während man sie mit dem festlegt .

Aus dem oben genannten Grund müssen Sie den Ansatz in der Antwort von @ Xiaofu verwenden, da die Attribute entfernt werden, nachdem das Signal aus ihnen extrahiert wurde.


öffentliche statische Zeichenfolge GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) Assembly
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true)
    .Single();
   return attribute.InformationalVersion;
}}

(Von http://bytes.com/groups/net/420417-assemblyversionattribute - wie dort angegeben, wenn Sie nach einem anderen Attribut suchen, ersetzen Sie dieses durch das oben genannte.)


Hey Ruben, 2 Notizen. Zunächst wurde die Frage nach AssemblyFileVersion und nicht nach AssemblyVersion gestellt. Zweitens gibt Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) ein Array der Länge 0 zurück. Ich denke, dies liegt daran, dass AssemblyVersionAttribute kein benutzerdefiniertes Attribut ist.
Iain

Zum ersten Punkt sagte ich deshalb: "Wenn Sie nach einem anderen Attribut suchen, ersetzen Sie dieses durch das obige" (IIRC habe ich nicht ausprobiert). Zum zweiten, das scheint plausibel, hat aber keine Zeit zum Eingraben ...
Ruben Bartelink

Ja, Sie können das AssemblyVersion-Attribut nicht über .GetCustomAttribute () abrufen. Die Assemblyversion kann nur über die AssemblyName.VersionEigenschaft abgerufen werden . Aber mit jedem anderen Attribut ist es der richtige Weg
Dmitrii Lobanov

@DmitryLobanov und Iain Danke für die Eingabeaufforderungen. Ich hoffe, dass die Bearbeitung es ausreichend abdeckt, damit die Antwort es wert ist, behalten zu werden, anstatt sie zu löschen - lassen Sie es mich wissen!
Ruben Bartelink

1
Ich habe AssemblyInformationalVersionAttributeanstelle von AssemblyVersionAttribute.net Core 3.1
Vasya Milovidov

5

Benutze das:

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

Oder dieses:

new Version(System.Windows.Forms.Application.ProductVersion);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.