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?

Enyra
quelle
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;
Xiaofu
quelle
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;
Check6
quelle
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;
Syntap
quelle
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.)

Ruben Bartelink
quelle
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);
Pieter Geerkens
quelle