So erhalten Sie die Versionsnummer der EXE-Datei aus dem Dateipfad

74

Ich verwende .Net 3.5 / 4.0 mit Code in C #.

Ich versuche, eine Versionsnummer einer exe-Datei auf meinem Laufwerk C: abzurufen.

Der Pfad lautet beispielsweise: c: \ Program \ demo.exe. Wenn die Versionsnummer von demo.exe 1.0 ist.

Wie kann ich diesen Pfad verwenden, um die Versionsnummer abzurufen?

NoviceMe
quelle

Antworten:

142

Sie können FileVersionInfo.FileVersion verwenden , um dies von einem Pfad abzurufen.

var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.FileVersion; // Will typically return "1.0.0.0" in your case
Reed Copsey
quelle
9
".ProductVersion" ist keine "Versionsnummer einer Datei". Dies sollte von der Dateiversion (".FileVersion") unterschieden werden. Siehe mein erweitertes Beispiel. Darüber hinaus können beide Versionen aus vier Teilen bestehen, und normalerweise erhalten Sie diese vier, sodass "1.0.0" untypisch und "1.0.0.0" kanonisch ist.
Philm
manchmal funktioniert das und manchmal andere nicht ... irgendeinen Hinweis?
Gumuruh
32

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:

  1. 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).

  2. Die Dateiversion (die im Explorer sichtbar ist und in Setups / Installationen verwendet wird) ist das, was ich als das Wichtigste bezeichnen würde.

  3. 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.
    ")]

  4. 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; // No difference here for versinfo.ProductVersion if recommendation in AssemblyInfo.cs is followed
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.

Philm
quelle
21

In der akzeptierten Antwort wird auf "pathToExe" verwiesen.

Dieser Pfad kann wie folgt abgerufen und verwendet werden:

var assembly = Assembly.GetExecutingAssembly();
var fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
var version = fvi.FileVersion; // or fvi.ProductVersion

Ich hoffe, dies erspart jemandem unnötige zusätzliche Schritte.

Sophtware
quelle
3
Dies ist nur korrekt, wenn Sie die Versionsnummer der aktuell ausgeführten Datei lesen möchten. In den meisten Fällen müssen Sie die Version einer anderen Datei lesen, beispielsweise während der Erstellung der Verzeichnisliste
AaA
7

Wo Programist dein Klassenname:

Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;
Ralf
quelle
5

Ich bin mir nicht sicher, ob Sie danach suchen, aber:

http://www.daniweb.com/software-development/csharp/threads/276174/c-code-to-get-dll-version

Es sagt,

// Get the file version info for the notepad.
FileVersionInfo myFileVersionInfo =  FileVersionInfo.GetVersionInfo(Environment.SystemDirectory + "\\notepad.exe");

// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' + "Version number: " + myFileVersionInfo.FileVersion);
Drakkainen
quelle
2

Verwenden Sie dies, es funktioniert:

using System.Reflection;

string v = AssemblyName.GetAssemblyName("Path/filename.exe").Version.ToString();
phuc.nx
quelle
Funktioniert! (Warum negativer Punkt?) Diese Methode erhält AssemblyVersion, andere oben erhalten AssemblyFileVersion
Sergio Cabral
0
  • Lösung 1

    Dim fileVer As FileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.CurrentDirectory + "\yourExe.exe")
    yourLabel.Text = fileVer.FileVersion
    
  • Lösung 2

    Holen Sie sich die Versionsnummer der Datei

    yourLabel.Text = Application.ProductVersion
    

Beide Lösungen ergeben 1.0.0.0

Tuan Zaidi
quelle
Nein, Application.ProductVersiongibt normalerweise 1.0.0 aus, nicht 1.0.0.0
Momoro