webentwicklung-frage-antwort-db.com.de

Kann ich die Dateierstellungsversion bei Verwendung von Visual Studio automatisch erhöhen?

Ich habe mich nur gefragt, wie ich automatisch den Build (und die Version?) Meiner Dateien mit Visual Studio (2005) erhöhen kann.

Wenn ich die Eigenschaften von "say C:\Windows\notepad.exe" Nachschlage, wird auf der Registerkarte "Version" "Dateiversion: 5.1.2600.2180" angezeigt. Ich möchte diese coolen Zahlen auch in der Version meiner DLLs haben, nicht in der Version 1.0.0.0, die allerdings etwas langweilig ist.

Ich habe ein paar Dinge ausprobiert, aber es scheint keine Standardfunktionalität zu sein, oder ich suche einfach (wie üblich) an der falschen Stelle.

Ich arbeite hauptsächlich mit Webprojekten ....

Ich habe mir beide angesehen:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

und ich konnte nicht glauben, dass es so viel Mühe ist, etwas zu tun.

BEARBEITEN: Es funktioniert nicht in VS2005, soweit ich das beurteilen kann ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx )

343
inspite

In Visual Studio 2008 funktioniert Folgendes.

Suchen Sie die AssemblyInfo.cs-Datei, und suchen Sie diese 2 Zeilen:

[Assembly: AssemblyVersion("1.0.0.0")]
[Assembly: AssemblyFileVersion("1.0.0.0")]

Sie könnten versuchen, dies zu ändern:

[Assembly: AssemblyVersion("1.0.*")]
[Assembly: AssemblyFileVersion("1.0.*")]

Dies führt jedoch nicht zum gewünschten Ergebnis. Sie erhalten eine Produktversion von 1.0. * und eine Dateiversion von 1.0.0.. Nicht was du willst!

Wenn Sie jedoch die zweite dieser Zeilen entfernen und nur Folgendes haben:

[Assembly: AssemblyVersion("1.0.*")]

Dann setzt der Compiler die Dateiversion auf die Produktversion und Sie erhalten das gewünschte Ergebnis einer automatischen Erhöhung der Produkt- und Dateiversion, die synchron sind. Z.B. 1.0.3266.92689

418
Sam Meldrum

öffnen Sie die Datei AssemblyInfo.cs und ändern Sie sie

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [Assembly: AssemblyVersion("1.0.*")]
[Assembly: AssemblyVersion("1.0.0.0")]
[Assembly: AssemblyFileVersion("1.0.0.0")]

zu

[Assembly: AssemblyVersion("1.0.*")]
//[Assembly: AssemblyFileVersion("1.0.0.0")]

sie können dies in IDE unter project -> properties -> Assembly information tun

Dadurch können Sie jedoch nur die Assembly-Version automatisch inkrementieren und erhalten die

Assembly-Dateiversion: In diesem Feld ist kein Platzhalter ("*") zulässig

meldungsfeld, wenn Sie versuchen, ein * in das Feld für die Dateiversion einzufügen.

Öffne also einfach die assemblyinfo.cs und mache es manuell.

151
Hath

Eine weitere Option zum Ändern der Versionsnummern in jedem Build ist die Verwendung der Version Aufgabe von MSBuild.Community.Tasks . Laden Sie einfach das Installationsprogramm herunter, installieren Sie es, passen Sie den folgenden Code an und fügen Sie ihn nach <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> in Ihre .csproj - Datei ein:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

Hinweis: Passen Sie die StartDate-Eigenschaft an Ihr Gebietsschema an. Derzeit wird die invariante Kultur nicht verwendet.

Für den dritten Build am 14. Januar 2010 wird ein VersionInfo.cs Mit folgendem Inhalt erstellt:

[Assembly: AssemblyVersion("1.0")]
[Assembly: AssemblyFileVersion("1.0.14.2")]

Diese Datei muss dann zum Projekt hinzugefügt werden (über Vorhandenes Element hinzufügen ) und die AssemblyVersion und AssemblyFileVersion Zeilen müssen aus AssemblyInfo.cs entfernt werden.

Die verschiedenen Algorithmen zum Ändern der Versionskomponenten sind in $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm und Version Properties beschrieben.

52
Christian

Ich habe eine Lösung gefunden, die Christen ähnelt, aber nicht von den Community-MSBuild-Aufgaben abhängt. Dies ist für mich keine Option, da ich diese Aufgaben nicht für alle unsere Entwickler installieren möchte.

Ich generiere Code und kompiliere zu einer Assembly und möchte die Versionsnummern automatisch erhöhen. Ich kann jedoch den VS 6.0. * AssemblyVersion-Trick nicht verwenden, da er Build-Nummern jeden Tag automatisch inkrementiert und die Kompatibilität mit Assemblys, die eine ältere Build-Nummer verwenden, beeinträchtigt. Stattdessen möchte ich eine fest codierte AssemblyVersion haben, aber eine automatisch inkrementierende AssemblyFileVersion. Ich habe dies erreicht, indem ich AssemblyVersion in AssemblyInfo.cs angegeben und in MSBuild eine VersionInfo.cs wie diese erstellt habe.

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[Assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

Dadurch wird eine VersionInfo.cs-Datei mit einem Assembly-Attribut für AssemblyFileVersion generiert, wobei die Version dem Schema von YY.MM.DD.TTTT mit dem Erstellungsdatum folgt. Sie müssen diese Datei in Ihr Projekt aufnehmen und damit erstellen.

24
Boog

Installieren Sie das Add-In Build Version Increment . Es gibt Ihnen viel mehr Kontrolle als die Option *.

16
null

Um die Versionsnummern zu erhalten, versuchen Sie

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = Assembly.GetName();
 Version version = assemblyName.Version;

Erstellen/bearbeiten Sie AssemblyInfo.cs, um die Versionsnummer festzulegen

 [Assembly: AssemblyVersion("1.0.*")]
 [Assembly: AssemblyFileVersion("1.0.*")]

Ebenfalls als Randnotiz ist die dritte Zahl die Anzahl der Tage seit dem 1.1.2000 und die vierte Zahl die Hälfte der Gesamtsekunde des Tages. Wenn Sie also um Mitternacht kompilieren, sollte es Null sein.

12
Bob

Es gibt eine Visual Studio-Erweiterung Automatic Versions , die Visual Studio 2012, 2013, 2015 und 2017 unterstützt.

Screenshots enter image description here

enter image description here

9
Rahul

Das Festlegen eines * in der Versionsnummer in AssemblyInfo oder unter Projekteigenschaften, wie in den anderen Beiträgen beschrieben, funktioniert nicht mit allen Versionen von Visual Studio/.NET.

Afaik hat es in VS 2005 nicht funktioniert (aber in VS 2003 und VS 2008). Für VS 2005 können Sie Folgendes verwenden: Auto Increment Visual Studio 2005-Versionserstellung und Versionsnummer zur Kompilierungszeit .

Beachten Sie jedoch, dass das automatische Ändern der Versionsnummer für Assemblys mit starkem Namen nicht empfohlen wird. Der Grund dafür ist, dass alle Verweise auf eine solche Assembly jedes Mal aktualisiert werden müssen, wenn die referenzierte Assembly neu erstellt wird, da stark benannte Assembly-Verweise immer auf eine bestimmte Assembly-Version verweisen. Microsoft selbst ändert die Versionsnummer der .NET Framework-Assemblys nur, wenn sich Änderungen an den Schnittstellen ergeben. (NB: Ich suche immer noch nach dem Link in MSDN, wo ich das gelesen habe.)

8
Dirk Vollmar

Inkrementieren (DateTime) von Informationen in die AssemblyFileVersion-Eigenschaft, die den Vorteil hat, dass keine Abhängigkeiten unterbrochen werden.


Aufbauend auf Boogs Lösung (hat bei mir möglicherweise aufgrund von VS2008 nicht funktioniert?) Können Sie eine Kombination aus einem vorab erstellten Ereignis verwenden, das eine Datei generiert, diese Datei (einschließlich ihrer Versionsmerkmale) hinzufügt und dann eine Methode zum Auslesen verwendet diese Werte wieder. Das ist..

Pre-Build-Event:

echo [Assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

Fügen Sie die resultierende Datei VersionInfo.cs (Unterordner Properties) in Ihr Projekt ein

Code zum Zurückholen des Datums (Jahre bis zu Sekunden):

var version = Assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(Assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

Nicht sehr komfortabel .. außerdem weiß ich nicht, ob es viele Force-Neuerstellungen gibt (da sich eine Datei immer ändert).

Sie könnten es beispielsweise intelligenter gestalten, wenn Sie die Datei VersionInfo.cs nur alle paar Minuten/Stunden aktualisieren (indem Sie eine temporäre Datei verwenden und dann die echte VersionInfo.cs kopieren/überschreiben, wenn eine ausreichend große Änderung festgestellt wird). Ich habe das mal ziemlich erfolgreich gemacht.

6
Andreas Reiff

Setzen Sie die Versionsnummer auf "1.0. *" Und es werden automatisch die letzten beiden Nummern mit dem Datum (in Tagen ab einem bestimmten Zeitpunkt) und der Uhrzeit (die Hälfte der Sekunden ab Mitternacht) gefüllt.

5
James Curran

Cake unterstützt das Patchen von AssemblyInfo-Dateien. Mit cake in hands haben Sie unendlich viele Möglichkeiten, die automatische Versionserhöhung zu implementieren.

Einfaches Beispiel für das Inkrementieren einer Version wie der C # -Compiler:

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

Hier:

  • Version - ist die Assembly-Version. Es wird empfohlen, die Hauptversionsnummer zu sperren und die verbleibenden Nullen beizubehalten (z. B. "1.0.0.0").
  • FileVersion - ist die Assembly-Dateiversion.

Beachten Sie, dass Sie nicht nur Versionen patchen können, sondern auch auch alle anderen erforderlichen Informationen .

4
hal

Es befindet sich in Ihren Projekteigenschaften unter Veröffentlichen

http://screencast.com/t/Vj7rhqJO
(~ http://screencast.com/t/Vj7rhqJO )

4
Alex

Gehen Sie zu Projekt | Eigenschaften und dann Baugruppeninformationen und dann Baugruppenversion, und setzen Sie ein * in das letzte oder vorletzte Feld (Sie können die Haupt- oder Nebenkomponenten nicht automatisch inkrementieren).

3
MusiGenesis

So erhalten Sie die Version {major}.{year}.1{date}.1{time}

Dieser ist ein bisschen experimentell, aber ich mag es. Inspiriert von Jeff Atwood @ CodingHorror ( link ).

Die resultierende Versionsnummer wird zu 1.2016.10709.11641 (Was 2016-07-09 16:41 bedeutet), was berücksichtigt

  • arme mans zero padding (mit den dummen führenden 1 s)
  • fast menschlich lesbares lokales DateTime, eingebettet in die Versionsnummer
  • lassen Sie die Major-Version für wirklich wichtige Änderungen alleine.

Fügen Sie Ihrem Projekt ein neues Element hinzu, wählen Sie "Allgemein" -> "Textvorlage", geben Sie dem Element einen Namen wie "CustomVersionNumber" und kommentieren Sie (falls zutreffend) die Zeichen "AssemblyVersion" und "AssemblyFileVersion" in Properties/AssemblyInfo.cs.

Wenn Sie diese Datei speichern oder das Projekt erstellen, wird dadurch eine .cs - Datei neu generiert, die sich als Unterelement unter der erstellten .tt - Datei befindet.

<#@ template language="C#" #>
<#@ Assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[Assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[Assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
2
user3638471

Ab sofort für meine Bewerbung,

string ver = Application.ProductVersion;

kehrt zurück ver = 1.0.3251.27860

Der Wert 3251 gibt die Anzahl der Tage seit dem 1.1.2000 an. Ich verwende es, um ein Versionserstellungsdatum in den Begrüßungsbildschirm meiner Anwendung einzufügen. Im Umgang mit einem Benutzer kann ich nach dem Erstellungsdatum fragen, das einfacher zu kommunizieren ist als eine lange Nummer.

(Ich bin eine Ein-Mann-Abteilung, die eine kleine Firma unterstützt. Dieser Ansatz funktioniert möglicherweise nicht für Sie.)

2
SeaDrive

Verwenden Sie die AssemblyInfo-Aufgabe aus dem MSBuild Community Tasks ( http://msbuildtasks.tigris.org/ ) -Projekt und integrieren Sie sie in Ihre .csproj/.vbproj-Datei.

Es gibt eine Reihe von Optionen, darunter eine, mit der die Versionsnummer mit dem Datum und der Uhrzeit verknüpft werden kann.

Empfohlen.

2
devstuff

Das Ändern der AssemblyInfo funktioniert in VS2012. Es scheint seltsam, dass Visual Studio dies nicht mehr unterstützt. Man könnte meinen, dass dies ein grundlegender Teil des Build-/Release-Prozesses war.

2
Maxcelcat

AssemblyInfoUtil . Kostenlos. Open Source.

1
Sergiy

Vielleicht ist es zu spät, um hier zu antworten, aber ich hoffe, dass dies das hektische Problem eines Menschen löst.

Eine automatische Möglichkeit, die Assembly-Version aller Ihrer Projekte mithilfe des PowerShell-Skripts zu ändern. Dieser Artikel wird viele Ihrer Probleme lösen.

1
Khawaja Asim

Ich verwende diesen Ansatz https://stackoverflow.com/a/827209/3975786 indem ich die T4-Vorlage in einem "Lösungselement" platziere und sie mit "Als Link hinzufügen" in jedem Projekt verwende.

1
mcandal

Vielleicht können Sie für diese Aufgabe folgenden Code verwenden:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[Assembly: AssemblyFileVersion(\"" + ol + "\")]", "[Assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

und rufen Sie es vom Formular laden.
Mit diesem Code können Sie einen beliebigen Teil der Dateiinformationen in AssemblyInfo.cs aktualisieren (Sie müssen jedoch die "Standard" -Verzeichnisstruktur verwenden).

1
Atiris

Ich habe eine Anwendung erstellt, um die Dateiversion automatisch zu erhöhen.

  1. Download Anwendung
  2. fügen Sie die folgende Zeile zur Befehlszeile des vorab erstellten Ereignisses hinzu

    C:\temp\IncrementFileVersion.exe $ (SolutionDir)\Properties\AssemblyInfo.cs

  3. Erstellen Sie das Projekt

Um es einfach zu halten, wirft die App nur dann Nachrichten, wenn ein Fehler vorliegt. Um zu bestätigen, dass es einwandfrei funktioniert hat, müssen Sie die Dateiversion unter "Assembly-Informationen" überprüfen.

Hinweis: Sie müssen die Projektmappe in Visual Studio für die Schaltfläche "Baugruppeninformationen" neu laden, um die Felder auszufüllen. Ihre Ausgabedatei enthält jedoch die aktualisierte Version.

Für Vorschläge und Anfragen senden Sie mir bitte eine E-Mail an [email protected]

0
Telson Alva

Jedes Mal, wenn ich einen Build durchführe, wird die niedrigstwertige Ziffer automatisch inkrementiert.

Ich habe keine Ahnung, wie ich die anderen updaten soll, aber das solltest du zumindest schon sehen ...

0
Brian Knoblauch

In Visual Studio 2019

Es war nicht genug für mich hinzuzufügen

[Assembly: AssemblyVersion("1.0.*")]

Beim Bauen wirft es mir diesen Fehler auf

Die angegebene Versionszeichenfolge entspricht nicht dem erforderlichen Format

Lösung

Das Format wurde schließlich akzeptiert, nachdem ich Deterministic in project.csproj Auf False gesetzt hatte.

<Deterministic>false</Deterministic>

Bearbeiten:

Aus irgendeinem Grund hat das Setzen von Deterministic auf False meine Konfigurationsdatei durcheinander gebracht, indem sie geladen und an verschiedenen Orten gespeichert wurde.

Problemumgehung:

Ich richte ein Postbuild-Ereignis ein, um die Revisionsnummer zu erhöhen:

Batch-Skript für Post-Build-Ereignisse

Dies ruft ein Powershell-Skript mit dem Namen autoincrement_version.ps1 Auf, das als Argument den Pfad von AssemblyInfo.cs Übergibt.

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

Poweshell-Skript

Die Revisionsnummer wird mithilfe von Regex automatisch inkrementiert

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8
0
Madacol