AssemblyVersion
Wo andere Baugruppen suchen, die auf Ihre Baugruppe verweisen. Wenn sich diese Anzahl ändert, müssen andere Baugruppen ihre Verweise auf Ihre Baugruppe aktualisieren! Aktualisieren Sie diese Version nur, wenn die Abwärtskompatibilität beeinträchtigt ist. Das AssemblyVersion
ist erforderlich.
Ich benutze das Format: major.minor . Dies würde führen zu:
[assembly: AssemblyVersion("1.0")]
Wenn Sie SemVer strikt befolgen, bedeutet dies, dass Sie nur dann aktualisieren, wenn sich die wichtigsten Änderungen ergeben, also 1.0, 2.0, 3.0 usw.
AssemblyFileVersion
Wird für die Bereitstellung verwendet. Sie können diese Anzahl für jede Bereitstellung erhöhen. Es wird von Setup-Programmen verwendet. Verwenden Sie diese Option, um Assemblys zu markieren, die dieselbe haben AssemblyVersion
, aber aus verschiedenen Builds generiert wurden.
In Windows kann es in den Dateieigenschaften angezeigt werden.
Die AssemblyFileVersion ist optional. Wenn nicht angegeben, wird die AssemblyVersion verwendet.
Ich verwende das Format: major.minor.patch.build , wobei ich SemVer für die ersten drei Teile folge und die Build-Nummer des Buildservers für den letzten Teil verwende (0 für den lokalen Build). Dies würde führen zu:
[assembly: AssemblyFileVersion("1.3.2.254")]
Beachten Sie, dass System.Version diese Teile wie folgt benennt major.minor.build.revision
!
AssemblyInformationalVersion
Die Produktversion der Baugruppe. Dies ist die Version, die Sie verwenden würden, wenn Sie mit Kunden sprechen oder auf Ihrer Website angezeigt werden. Diese Version kann eine Zeichenfolge sein, z. B. ' 1.0 Release Candidate '.
Das AssemblyInformationalVersion
ist optional. Wenn nicht angegeben, wird die AssemblyFileVersion verwendet.
Ich benutze das Format: major.minor [.patch] [Revision als String] . Dies würde führen zu:
[assembly: AssemblyInformationalVersion("1.0 RC1")]
major.minor[.build[.revision]]
und nichtmajor.minor.revision.build
so in der angegebenen Antwort würden die Build- und Revisionsnummern ausgetauscht, wenn Sie die Klasseneigenschaften verwenden oderSystem.Reflection.Assembly.GetExecutingAssembly().GetName().Version
die Build- und Revisionsnummern erkennen würden.AssemblyInformationalVersion
, wenn weggelassen,AssemblyFileVersion
verwendet wird. Dann,AssemblyVersion
wenn beide weggelassen werden.Die Versionierung von Assemblys in .NET kann verwirrend sein, da es derzeit mindestens drei Möglichkeiten gibt, eine Version für Ihre Assembly anzugeben.
Hier sind die drei wichtigsten versionierungsbezogenen Assembly-Attribute:
Konventionell werden die vier Teile der Version als Hauptversion , Nebenversion , Build und Revision bezeichnet .
Das
AssemblyFileVersion
soll einen Aufbau der einzelnen Baugruppe eindeutig identifizierenIn der Regel legen Sie die Haupt- und Neben-AssemblyFileVersion manuell so fest, dass sie die Version der Assembly widerspiegelt, und erhöhen dann die Erstellung und / oder Revision jedes Mal, wenn Ihr Build-System die Assembly kompiliert. Mit der AssemblyFileVersion sollten Sie einen Build der Assembly eindeutig identifizieren können, damit Sie ihn als Ausgangspunkt für das Debuggen von Problemen verwenden können.
In meinem aktuellen Projekt hat der Build-Server die Änderungslistennummer aus unserem Versionsverwaltungs-Repository in die Build- und Revisionsteile der AssemblyFileVersion codiert. Auf diese Weise können wir für jede vom Buildserver generierte Assembly eine direkte Zuordnung von einer Assembly zu ihrem Quellcode vornehmen (ohne Beschriftungen oder Verzweigungen in der Quellcodeverwaltung verwenden oder Aufzeichnungen über freigegebene Versionen manuell führen zu müssen).
Diese Versionsnummer wird in der Win32-Versionsressource gespeichert und kann beim Anzeigen der Windows Explorer-Eigenschaftenseiten für die Assembly angezeigt werden.
Die CLR kümmert sich nicht um die AssemblyFileVersion und untersucht sie auch nicht.
Das
AssemblyInformationalVersion
soll die Version Ihres gesamten Produkts darstellenDie AssemblyInformationalVersion soll eine kohärente Versionierung des gesamten Produkts ermöglichen, die aus vielen Assemblys bestehen kann, die unabhängig voneinander versioniert sind, möglicherweise mit unterschiedlichen Versionsrichtlinien, und möglicherweise von unterschiedlichen Teams entwickelt werden.
Die CLR kümmert sich nicht um die AssemblyInformationalVersion und untersucht sie auch nicht.
Dies
AssemblyVersion
ist die einzige Version, die die CLR interessiert (aber sie kümmert sich um die gesamte VersionAssemblyVersion
).Die AssemblyVersion wird von der CLR verwendet, um an stark benannte Assemblys zu binden. Es wird in der AssemblyDef-Manifest-Metadatentabelle der erstellten Assembly und in der AssemblyRef-Tabelle jeder Assembly gespeichert, die darauf verweist.
Dies ist sehr wichtig, da Sie beim Verweisen auf eine stark benannte Assembly eng an eine bestimmte AssemblyVersion dieser Assembly gebunden sind. Die gesamte AssemblyVersion muss genau übereinstimmen, damit die Bindung erfolgreich ist. Wenn Sie beispielsweise zur Erstellungszeit auf Version 1.0.0.0 einer Assembly mit starkem Namen verweisen, zur Laufzeit jedoch nur Version 1.0.0.1 dieser Assembly verfügbar ist, schlägt die Bindung fehl! (Sie müssen dies dann mithilfe der Assembly Binding Redirection umgehen .)
Verwirrung darüber, ob das Ganze
AssemblyVersion
übereinstimmen muss. (Ja tut es.)Es gibt ein wenig Verwirrung darüber, ob die gesamte AssemblyVersion genau übereinstimmen muss, damit eine Assembly geladen werden kann. Einige Menschen glauben fälschlicherweise, dass nur die Haupt- und Nebenteile der AssemblyVersion übereinstimmen müssen, damit die Bindung erfolgreich ist. Dies ist eine vernünftige Annahme, die jedoch letztendlich falsch ist (ab .NET 3.5), und es ist trivial, dies für Ihre Version der CLR zu überprüfen. Führen Sie einfach diesen Beispielcode aus .
Auf meiner Maschine schlägt die zweite Baugruppenlast fehl, und die letzten beiden Zeilen des Fusionsprotokolls machen deutlich, warum:
Ich denke, die Ursache für diese Verwirrung liegt wahrscheinlich darin, dass Microsoft ursprünglich beabsichtigte, diese strikte Übereinstimmung der vollständigen AssemblyVersion etwas milder zu gestalten, indem nur die Teile der Haupt- und Nebenversion abgeglichen wurden:
Dies war das Verhalten in Beta 1 der 1.0 CLR. Diese Funktion wurde jedoch vor der 1.0-Version entfernt und konnte in .NET 2.0 nicht wieder auftauchen:
Da diese Änderung noch nicht implementiert wurde, kann man davon ausgehen, dass Microsoft diese Absicht zurückverfolgt hat, und es ist möglicherweise zu spät, dies jetzt zu ändern. Ich habe versucht, im Internet zu suchen, um herauszufinden, was mit diesen Plänen passiert ist, aber ich konnte keine Antworten finden. Ich wollte immer noch auf den Grund gehen.
Also schrieb ich Jeff Richter eine E-Mail und fragte ihn direkt - ich dachte, wenn jemand wüsste, was passiert ist, wäre er es.
Er antwortete innerhalb von 12 Stunden, nicht weniger an einem Samstagmorgen, und stellte klar, dass der .NET 1.0 Beta 1-Lader diesen "automatischen Roll-Forward" -Mechanismus zum Abrufen des neuesten verfügbaren Builds und der neuesten Revision einer Baugruppe implementiert hat, aber dieses Verhalten war vor dem Versand von .NET 1.0 zurückgesetzt. Es war später beabsichtigt, dies wiederzubeleben, aber es hat es nicht geschafft, bevor die CLR 2.0 ausgeliefert wurde. Dann kam Silverlight, das für das CLR-Team Priorität hatte, sodass sich diese Funktionalität weiter verzögerte. In der Zwischenzeit sind die meisten Leute, die in den Tagen von CLR 1.0 Beta 1 da waren, inzwischen weitergezogen, so dass es unwahrscheinlich ist, dass dies trotz all der harten Arbeit, die bereits in sie gesteckt wurde, das Licht der Welt erblicken wird.
Das derzeitige Verhalten scheint hier zu bleiben.
Aus meiner Diskussion mit Jeff geht auch hervor, dass AssemblyFileVersion erst nach dem Entfernen des automatischen Roll-Forward-Mechanismus hinzugefügt wurde. Nach 1.0 Beta 1 war jede Änderung an AssemblyVersion eine bahnbrechende Änderung für Ihre Kunden Nirgendwo können Sie Ihre Build-Nummer sicher speichern. AssemblyFileVersion ist dieser sichere Hafen, da er von der CLR nie automatisch überprüft wird. Vielleicht ist es auf diese Weise klarer, zwei separate Versionsnummern mit unterschiedlichen Bedeutungen zu haben, als zu versuchen, diese Trennung zwischen den Teilen Major / Minor (Breaking) und Build / Revision (Non-Breaking) der AssemblyVersion vorzunehmen.
Fazit: Überlegen Sie genau, wann Sie Ihre ändern
AssemblyVersion
Die Moral lautet: Wenn Sie Assemblys versenden, auf die andere Entwickler verweisen, müssen Sie äußerst vorsichtig sein, wenn Sie die AssemblyVersion dieser Assemblys ändern (und nicht ändern). Alle Änderungen an der AssemblyVersion bedeuten, dass Anwendungsentwickler entweder eine Neukompilierung mit der neuen Version durchführen müssen (um diese AssemblyRef-Einträge zu aktualisieren) oder Assemblybindungsumleitungen verwenden müssen, um die Bindung manuell zu überschreiben.
Schauen Sie sich noch einmal die Versionsattribute auf mscorlib an:
Beachten Sie, dass es die AssemblyFileVersion ist, die alle interessanten Wartungsinformationen enthält (es ist der Revisionsteil dieser Version, der Ihnen sagt, auf welchem Service Pack Sie sich befinden), während die AssemblyVersion auf eine langweilige alte Version 2.0.0.0 festgelegt ist. Jede Änderung an der AssemblyVersion würde jede .NET-Anwendung, die auf mscorlib.dll verweist, dazu zwingen, erneut gegen die neue Version zu kompilieren!
quelle
AssemblyVersion
bleibt so ziemlich intern in .NET, währendAssemblyFileVersion
Windows dies sieht. Wenn Sie zu den Eigenschaften einer Assembly gehen, die sich in einem Verzeichnis befindet, und zur Registerkarte "Version" wechseln,AssemblyFileVersion
sehen Sie diese oben. Wenn Sie Dateien nach Version sortieren, wird dies vom Explorer verwendet.Die
AssemblyInformationalVersion
Karten sind der "Produktversion" zugeordnet und sollen rein "vom Menschen verwendet" werden.AssemblyVersion
ist sicherlich das Wichtigste, aber ich würde es auch nicht überspringenAssemblyFileVersion
. Wenn Sie nichts angebenAssemblyInformationalVersion
, fügt der Compiler es für Sie hinzu, indem er das "Revisions" -Element Ihrer Versionsnummer entfernt und die Datei major.minor.build verlässt.quelle
AssemblyInformationalVersion
undAssemblyFileVersion
werden angezeigt, wenn Sie die "Versions" -Informationen einer Datei über den Windows Explorer anzeigen, indem Sie die Dateieigenschaften anzeigen. Diese Attribute werden tatsächlich in eineVERSION_INFO
Ressource kompiliert , die vom Compiler erstellt wird.AssemblyInformationalVersion
ist der Wert "Produktversion".AssemblyFileVersion
ist der Wert "Dateiversion".Das
AssemblyVersion
ist spezifisch für .NET-Assemblys und wird vom .NET Assembly Loader verwendet, um zu ermitteln, welche Version einer Assembly zur Laufzeit geladen / gebunden werden soll.Von diesen ist das
AssemblyVersion
Attribut das einzige, das von .NET unbedingt benötigt wird. Leider kann es auch die meisten Probleme verursachen, wenn es sich wahllos ändert, insbesondere wenn Sie Ihre Assemblys stark benennen.quelle
Um diese Frage auf dem
AssemblyInformationalVersion
neuesten Stand zu halten, sollte hervorgehoben werden, dass sie von NuGet verwendet wird und die Paketversion einschließlich aller Suffixe vor der Veröffentlichung widerspiegelt .Zum Beispiel eine AssemblyVersion von 1.0.3. *, Die mit dem asp.net-Kern dotnet-cli gepackt ist
Produziert ein Paket mit Version 1.0.3-ci-7, das Sie mit Reflexion überprüfen können, indem Sie:
quelle
Es lohnt sich, einige andere Dinge zu beachten:
1) Wie im Dialogfeld "Windows Explorer-Eigenschaften" für die generierte Baugruppendatei gezeigt, gibt es zwei Stellen, die als "Dateiversion" bezeichnet werden. Die in der Kopfzeile des Dialogfelds angezeigte zeigt die AssemblyVersion, nicht die AssemblyFileVersion.
Im Abschnitt Informationen zu anderen Versionen gibt es ein weiteres Element namens "Dateiversion". Hier können Sie sehen, was als AssemblyFileVersion eingegeben wurde.
2) AssemblyFileVersion ist nur einfacher Text. Es muss nicht den Einschränkungen des Nummerierungsschemas entsprechen, die AssemblyVersion ausführt (z. B. <build> <65K). Es kann 3.2. <Release Tag Text>. <Datetime> sein, wenn Sie möchten. Ihr Build-System muss die Token ausfüllen.
Darüber hinaus unterliegt AssemblyVersion nicht dem Platzhalterersatz. Wenn Sie in AssemblyInfo.cs nur den Wert "3.0.1. *" Haben, wird genau dies im Element Andere Versionsinformationen-> Dateiversionselement angezeigt.
3) Ich weiß jedoch nicht, wie sich die Verwendung von Versionsnummern für numerische Dateien auf ein Installationsprogramm auswirkt.
quelle
Wenn die AssemblyVersion einer Assembly geändert wird, müssen die referenzierenden Assemblys neu kompiliert werden, wenn sie einen starken Namen haben. Andernfalls wird die Assembly nicht geladen! Wenn es keinen starken Namen hat und nicht explizit zur Projektdatei hinzugefügt wird, wird es beim Erstellen nicht in das Ausgabeverzeichnis kopiert, sodass Sie möglicherweise abhängige Assemblys verpassen, insbesondere nach dem Bereinigen des Ausgabeverzeichnisses.
quelle