Aktualisiert und modernisiert 2018 (zB String-Interpolation von C # 6):
Die akzeptierte Antwort ist teilweise nicht korrekt (ProductVersion gibt normalerweise keine dreiteilige Version zurück) und etwas irreführend:
Hier ist eine vollständigere Antwort. Um den Haupttext nicht zu lang zu machen, habe ich ihn in eine kurze (er) Zusammenfassung aufgeteilt, die für viele Leute "genug" sein kann. Sie sind nicht verpflichtet, den detaillierten zweiten Teil zu lesen, also bitte nicht tl; dr :-)
Kurze Zusammenfassung:
Es gibt verschiedene Versionen (Assembly-Version, Dateiversion, Produktversion) jeder Datei, aber normalerweise sind sie alle gleich , damit die "Versionshölle" nicht bereits auf Dateiebene angezeigt wird (dies wird früh genug erfolgen).
Die Dateiversion (die im Explorer sichtbar ist und in Setups / Installationen verwendet wird) ist das, was ich als das Wichtigste bezeichnen würde.
Um dies zu erreichen, kommentieren Sie einfach die Dateiversion in der Datei AssemblyInfo.cs wie folgt aus . Dies stellt sicher, dass die drei möglichen unterschiedlichen Versionen einer Datei gleich sind!
[Assembly: AssemblyVersion ("1.1.2. ")]
// [Assembly: AssemblyFileVersion ("1.1.2. ")]
Zum Beispiel für die semantische Versionierung möchten Sie nur 3 Versionsteile aus möglichen 4 herausholen:
Eine automatische Build-Zählung für jeden Visual Studio-Build ist hilfreich. Diese Build-Zählung ist jedoch nicht immer nützlich, um Ihre internen oder externen Kunden zu informieren. Um die Dateiversion in Windows zu erwähnen, würde ich in Titeldialogen empfehlen, nur drei Teile v1.2.3 (und natürlich mit semantischer Versionierung) anzuzeigen:
using System.Diagnostics;
...
var versInfo= FileVersionInfo.GetVersionInfo(pathToVersionedFile);
string fileVersionFull = versInfo.FileVersion;
string fileVersionSemantic = $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
string fileVersionFull2 = $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}.{versInfo.FilePrivatePart}";
FileVersionFull2 zeigt nur, wie alle 4 Teile behandelt werden, mit Ausnahme des "V", das das gleiche wie FileVersionFull enthält .
Einzelheiten:
Zunächst finden Sie einen Spickzettel zum Abrufen und Festlegen der drei Versionen:
Dateiversion: [Assembly: AssemblyFileVersion (..)] => System.Diagnostics.FileVersionInfo.FileVersion
Produktversion: [Assembly: AssemblyInformationalVersion (..)] => System.Diagnostics.FileVersionInfo.ProductVersion
Baugruppenversion: [Baugruppe: AssemblyVersion (..)] => System.Reflection.Assembly.Version
Insbesondere die Standardeinstellungen können verwirrend sein. Empfohlener SO-Link zum Verständnis von Details: FileVersionInfo und AssemblyInfo
EntryAssembly vs. ExecutingAssembly
Um alle Fälle für das Abrufen der Version der laufenden App vollständig zu prüfen, suchen Sie an anderer Stelle nach weiteren Details, z. B. hier:
Was ist besser, um den Assembly-Standort GetAssembly (). Location oder GetExecutingAssembly (). Location
zu erhalten Seien Sie verwirrt, wenn EntryAssembly oder ExecutingAssembly verwendet werden sollen. Sie haben beide Vorteile und Vorbehalte. Wenn Sie den folgenden Code nicht in derselben Assembly wie die EXE-Datei haben, z. B. in einer Helfer-Assembly, werden die Dinge komplizierter. Normalerweise würden Sie dann EntryAssembly verwenden, um die Version der EXE-Datei abzurufen.
Aber: Für Komponententests in Visual Studio zum Testen von Routinen in einem parallelen EXE-Projekt funktioniert GetEntryAssembly () nicht (meine Umgebung: NUnit, VS2017). GetExecutingAssembly () stürzt jedoch nicht ab, nur während des Komponententests erhalten Sie die Assemblyversion des Testprojekts. Gut genug für mich. Es kann Situationen geben, die nicht so einfach sind.
Wenn gewünscht, können Sie die Deklaration als statisch weglassen, sodass es wirklich möglich ist, Versionen mehrerer verschiedener Assemblys in einem Programm abzurufen.
public static class AppInfo
{
public static string FullAssemblyName { get; }
..
static AppInfo()
{
Assembly thisAssembly = null;
try
{
thisAssembly = Assembly.GetEntryAssembly();
}
finally
{
if (thisAssembly is null)
thisAssembly = Assembly.GetExecutingAssembly();
}
FullAssemblyName = thisAssembly.Location;
var versInfo = FileVersionInfo.GetVersionInfo(FullAssemblyName);
..
}
}
Produktversion vs. Dateiversion: Die
Produktversion einer Datei wird auch im Windows Explorer angezeigt. Ich würde empfehlen, ProductVersion und FileVersion in der am besten vom Kunden sichtbaren Datei (meistens der Haupt-EXE-Anwendung) maximal zu unterscheiden. Aber es könnte natürlich eine Wahl sein, für jede Datei der "Haupt" -App zu differenzieren und allen die "Marketing" -Produktversion zu geben, die der Kunde sieht. Die Erfahrung zeigt jedoch, dass es weder notwendig noch billig ist, zu viel zu versuchen, technische Versionen und Marketingversionen zu synchronisieren. Die Verwirrung nimmt nicht wirklich ab, die Kosten steigen. Die im ersten Teil hier beschriebene Lösung sollte dies also meistens tun.
Verlauf: Assembly-Version vs. Dateiversion:
Ein Grund für unterschiedliche Versionen ist auch, dass eine .NET-Assembly theoretisch ursprünglich aus mehreren Dateien (Modulen) bestehen kann. Dies wird von Visual Studio nicht und nur sehr selten an anderer Stelle verwendet. Dies ist vielleicht ein historischer Grund, die Möglichkeit zu geben, diese beiden Versionen zu unterscheiden. Technisch gesehen ist die Assembly-Version für die .NET-bezogene Versionierung als GAC- und Side-by-Side-Version relevant. Die Dateiversion ist für klassische Setups relevanter, z. B. für das Überschreiben bei Updates oder für freigegebene Dateien.