879 Stimmen

Wie erhalte ich die Version der Assembly-Datei?

Unter AssemblyInfo Es gibt zwei Montageversionen:

  1. AssemblyVersion : Geben Sie die Version der zugewiesenen Baugruppe an.
  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 die Assembly Version mit der folgenden Code-Zeile:

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

Aber wie kann ich die Assembly File Version ?

2 Stimmen

Was meinen Sie mit "Version der Baugruppendatei" im Gegensatz zur "Version der Baugruppe"? Können Sie ein Beispiel nennen?

11 Stimmen

@Xiaofu -- "Assembly Version" ist das, was .NET intern verwendet. "Assembly File Version" ist das, was angezeigt wird, wenn Sie mit der rechten Maustaste auf eine Datei klicken und auf "Eigenschaften" und dann auf die Registerkarte "Details" gehen. Das ist nicht dasselbe.

0 Stimmen

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

1014voto

Xiaofu Punkte 14822

Siehe meinen obigen Kommentar mit der Bitte um Klärung, 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;

6 Stimmen

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

68 Stimmen

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(); liefert Ihnen die "kompilierte" Versionsnummer - die mit der FileVersion übereinstimmen sollte, wenn Sie beide Versionen auf die gleiche Weise einstellen.

0 Stimmen

Nett, aber ich verwende viel lieber die Eigenschaften FileMajorPart / FileMinorPart / FileBuildPart / FilePrivatePart, um die Ganzzahlen zu erhalten, als die vorformatierte Zeichenkette FileVersion. Niemand mag es, "1.9.0.0" in der Titelleiste eines Programms zu sehen.

310voto

Check6 Punkte 2607

Es gibt drei Versionen : Montage , 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;

5 Stimmen

Und für diejenigen, die diese in der Datei AssemblyInfo.cs angeben möchten, verwenden Sie für assemblyVersion (mit beliebigen Zahlen) === [assembly: AssemblyVersion("2.0.*")] für fileVersion verwenden === [assembly: AssemblyFileVersion("2.0.*")] und für productVersion verwenden === [assembly: AssemblyInformationalVersion("2.0.*")] Der letzte kann ein String-Suffix für SemVer Kompatibilität: [assembly: AssemblyInformationalVersion("2.0.0-alpha")]

0 Stimmen

Nachtrag: AssemblyFileVersion dürfen nicht die * Suffix-Notation :( Es werden alle vier Zahlen benötigt. [assembly: AssemblyFileVersion("2.0.0.1")]

93voto

syntap Punkte 913

Wenn ich auf die Version der Anwendungsdatei zugreifen möchte (was in Assembly Information -> File Version eingestellt ist), um z. B. den Text eines Etiketts beim Laden des Formulars darauf zu setzen, um die Version anzuzeigen, habe ich gerade verwendet

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

Dieser Ansatz erfordert einen Verweis auf System.Windows.Forms .

67 Stimmen

Beachten Sie, dass dies einen Verweis auf System.Windows.Forms erfordert und daher möglicherweise nicht für alle Anwendungen geeignet ist.

4 Stimmen

Leider ist das eine Schnur. Nicht ideal, wenn Sie sie selbst in ein einfacheres "v1.08"-Format umwandeln wollen. Viel praktischer ist es, wenn Sie das Versionsobjekt erhalten, um die Unterkomponenten als Ganzzahlen zu erhalten.

1 Stimmen

Außerdem wird die AssemblyFileVersion aus AssemblyInfo übernommen, nicht die AssemblyVersion, also Vorsicht!

28voto

Ruben Bartelink Punkte 57310

UPDATE: Wie von Richard Grimes in mein zitierter Beitrag @Iain und @Dmitry Lobanov, meine Antwort ist in der Theorie richtig, aber in der Praxis falsch.

Wie ich aus zahllosen Büchern usw. wissen sollte, legt man diese Eigenschaften zwar mit der Option [assembly: XXXAttribute] , werden sie vom Compiler gekapert und in die VERSIONINFO Ressource .

Aus dem oben genannten Grund müssen Sie den Ansatz in @Xiaofu's Antwort da die Attribute entfernt werden, nachdem das Signal aus ihnen extrahiert worden ist.


~~public static string GetProductVersion() { var attribute = (AssemblyVersionAttribute)Assembly .GetExecutingAssembly() .GetCustomAttributes( typeof(AssemblyVersionAttribute), true ) .Single(); return attribute.InformationalVersion; }~~

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

0 Stimmen

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

0 Stimmen

Re den ersten Punkt, das ist, warum ich sagte, "wenn Sie für ein anderes Attribut lookign sind, ersetzen Sie, dass in der oben genannten" (IIRC Ich habe es nicht ausprobiert). Re den zweiten, das scheint plausibel, aber nicht Zeit haben, in zu graben...

0 Stimmen

Ja, man kann das Attribut AssemblyVersion nicht über .GetCustomAttribute() abrufen, die Assembly-Version kann über AssemblyName.Version nur Eigentum. Aber bei jedem anderen Attribut ist es der richtige Weg, es zu tun

15voto

Verwenden Sie dies:

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

Oder dies:

new Version(System.Windows.Forms.Application.ProductVersion);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X