|
| » myCSharp.de Diskussionsforum |
|
|
|
|
Autor
 |
|
norman_timo
myCSharp.de-Poweruser/ Experte

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008 Herkunft: Wald-Michelbach (Odw)
 |
|
Hallo liebe Community,
ich habe ein VS Add-In entwickelt, das ich Euch nicht vorenthalten möchte.
IncrementalBuild: Es ist ein VS2005 Add-In, das bei jedem Release-Build die Revisionsnummer um eins erhöht. Das funktioniert innerhalb einer Solution für jedes Projekt, auch VB.NET und C# gemischt.
Folgende Vorgaben sind zu machen:
- Das Add-In inklusive der Dll muss in das allgemeine VS-Add-In Verzeichnis kopiert werden (normalerweise: "Eigene Dateien\VisualStudio2005\AddIn")
- Die Projekte sollten auch eine Revisionsnummer haben, damit das Add-In korrekt arbeitet (also z.B. 1.0.0.24)
- Es erhöht die Revisionsnummer VOR einem Release-Build um genau eine Revisionsnummer (also z.B. von 1.0.0.0 -> 1.0.0.1)
- Es erhöht keine Revisionsnummer bei einem Debug-Build
Folgendes müsste noch evaluiert werden:
- Ich weiß nicht wie es sich bei den Express Editionen verhält (und ob Add-Ins in Express Versionen überhupt unterstützt werden)
- Ich weiß nicht, ob es in VS2003 und/oder in VS2008 läuft
Persönliche Einrichtung:
- Ich möchte unbedingt, dass VOR dem kompilieren die Revisionsnummer erhöht wird. Es ist aber denkbar, dass man das auch NACH dem Kompilieren tun möchte, hierfür müsste lediglich das Event "OnBuildBegin" mit dem Event "OnBuildDone" ersetzt werden.
Hier der relevante Quellcode aus der connect.cs:
C#-Code: |
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using System.Text.RegularExpressions;
namespace IncrementalBuild
{
public class Connect : IDTExtensibility2
{
private DTE2 _applicationObject;
private AddIn _addInInstance;
private BuildEvents _BuildEvents;
public Connect()
{
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
{
}
public void OnAddInsUpdate(ref Array custom)
{
}
public void OnStartupComplete(ref Array custom)
{
}
public void OnBeginShutdown(ref Array custom)
{
}
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
_BuildEvents = ((DTE2)application).Events.BuildEvents;
_BuildEvents.OnBuildBegin += new _dispBuildEvents_OnBuildBeginEventHandler(BuildEvents_OnBuildBegin);
}
private void BuildEvents_OnBuildBegin(vsBuildScope Scope, vsBuildAction Action)
{
System.Diagnostics.Debug.WriteLine("BuildEvents_OnBuildDone");
if (_applicationObject.Solution.SolutionBuild.ActiveConfiguration.Name == "Release")
{
foreach (Project p in _applicationObject.Solution.Projects)
{
IncrementVersionRevision(p);
}
}
}
private void IncrementVersionRevision(Project project)
{
FileCodeModel fcm = null;
CodeAttribute2 assemblyVersionAttribute = null;
CodeAttribute2 fileVersionAttribute = null;
fcm = GetAssemblyInfo(project);
if (fcm == null)
{
System.Diagnostics.Debug.WriteLine("Konnte keine AssemblyInfo Datei zum Projekt '" + project.Name + "' finden!");
throw new Exception("Konnte keine AssemblyInfo Datei zum Projekt '" + project.Name + "' finden!");
}
assemblyVersionAttribute = (CodeAttribute2)fcm.CodeElements.Item("AssemblyVersion");
if (project.FileName.EndsWith("vbproj"))
{
fileVersionAttribute = (CodeAttribute2)fcm.CodeElements.Item("AssemblyFileVersion");
}
Regex re = new Regex(@"([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)");
Match M = re.Match(assemblyVersionAttribute.Value);
if (M.Success)
{
System.Diagnostics.Debug.WriteLine(project.FileName + " + increment revision: " + Convert.ToInt16(M.Groups[4].Value));
int revision = Convert.ToInt16(M.Groups[4].Value) + 1;
string newAssemblyVersion = string.Format(@"""{0}.{1}.{2}.{3}"""
, M.Groups[1].Value, M.Groups[2].Value, M.Groups[3].Value, revision);
assemblyVersionAttribute.Value = newAssemblyVersion;
if (fileVersionAttribute != null)
{
fileVersionAttribute.Value = newAssemblyVersion;
}
}
}
private FileCodeModel GetAssemblyInfo(Project project)
{
FileCodeModel retVal = null;
ProjectItem fallBack = null;
String assemblyName = String.Empty;
String fallBackName = String.Empty;
if (project.FileName.EndsWith("vbproj"))
{
assemblyName = "AssemblyInfo.vb";
fallBackName = "My Project";
}
else
{
assemblyName = "AssemblyInfo.cs";
fallBackName = "Properties";
}
foreach (ProjectItem pi in project.ProjectItems)
{
if (pi.Name == assemblyName)
{
retVal = pi.FileCodeModel;
break;
}
else if (pi.Name == fallBackName)
{
fallBack = pi;
}
}
if ((retVal == null) && (fallBack != null))
{
foreach (ProjectItem pi in project.ProjectItems.Item(fallBack.Name).ProjectItems)
{
if (pi.Name == assemblyName)
{
retVal = pi.FileCodeModel;
break;
}
}
}
return retVal;
}
}
}
|
Vielen Dank auch an Xqgene, der mir bei meinem Problem geholfen hat:
[gelöst] VS2005 Add-In selbst erstellen
Im Anhang befindet sich auch die komplette Solution.
VS2005, Add-In, Incremental, Build, inkrementelles, Erstellen
|
|
27.06.2008 08:07 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
norman_timo
myCSharp.de-Poweruser/ Experte

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008 Herkunft: Wald-Michelbach (Odw)
Themenstarter
 |
|
Und hier im Anhang befindet sich die Dll und das Add-In ohne Quellcode.
|
|
27.06.2008 08:09 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
fadass
myCSharp.de-Mitglied
Dabei seit: 26.08.2007
Beiträge: 101
 |
|
schöne sache
aber ich vermute gerade das du die Falsche Zahl erhöhst.
major, minor, build, revision
major = Version (wie z.B. bei nen Release mit großer Änderung)
minor = die Anzahl der veröffentlichten Version seit der Major Version.
build = Das ist die Zahl die erhöht werden sollte.
revision = Die kommt von Sourcecontrol programmen (Halt die Revision vom dem aktuellen Tag/Trunk/Branch)
Hab die infos mal in der msdn/Forum gelesen... Jahre her
|
|
27.06.2008 12:09 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
norman_timo
myCSharp.de-Poweruser/ Experte

Dabei seit: 13.07.2004
Beiträge: 4.507
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008 Herkunft: Wald-Michelbach (Odw)
Themenstarter
 |
|
Hallo fadass,
naja, ich schreibe ja direkt, dass ich die Revisionsnummer um eins erhöhe. Ich habe hier für uns das gleich der Build-Nummer gesetzt.
Es ist ja aber kein Problem anhand von meinem Quellcode das nach eigenen Wünschen anzupassen.
Grüße
Norman-Timo
|
|
27.06.2008 14:53 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
| Zwischen diesen beiden Beiträgen liegen mehr als 6 Monate. |
winSharp93
myCSharp.de-Team (Moderation)

Dabei seit: 19.01.2007
Beiträge: 3.870
Entwicklungsumgebung: VS 2010 Professional Herkunft: Freiburg
 |
|
Hallo norman_timo,
noch einmal danke für dieses kleine, aber feine Addin!!!
Eine Verbesserung musste ich aber dennoch hinzufügen: Automatische Speicherung der geänderten Datei. Andernfalls gibt es Probleme beim Build in Verbindung mit WPF Anwendungen.
Um das umzusetzen, muss man lediglich ein paar Zeilen abändern:
C#-Code: |
private void IncrementVersionRevision(Project project)
{
ProjectItem pi = GetAssemblyInfo(project);
fcm = pi.FileCodeModel;
pi.Save(pi.Name);
}
}
private ProjectItem GetAssemblyInfo(Project project)
{
ProjectItem retVal = null;
retVal = pi;
retVal = pi;
}
|
|
|
30.12.2008 11:55 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
| Zwischen diesen beiden Beiträgen liegen mehr als 2 Monate. |
Joetempes
myCSharp.de-Mitglied

Dabei seit: 29.03.2007
Beiträge: 638
Herkunft: Germany
 |
|
Hallo norman_timo,
vielen Dank, für das feine AddIn.
Habs grad bei mir zum Laufen gebracht und kann somit bestätigen es läuft unter
VisualStudio-2008-Pro ohne Probleme.
Anmerkungen für VS2008:
1.
Das VS-Add-In Verzeichnis ist default:
"...\Eigene Dateien\Visual Studio 2008\Addins\"
2.
In der Datei "IncrementalBuild.AddIn" muss die VS Version auf 9.0 gesetzt werden.
Grüße
|
|
25.03.2009 09:19 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
| Zwischen diesen beiden Beiträgen liegen mehr als 5 Monate. |
Stipo
myCSharp.de-Mitglied

Dabei seit: 09.04.2007
Beiträge: 579
Entwicklungsumgebung: VS 2010 Pro, Expression 4 Herkunft: Lörrach
 |
|
Hallo zusammen,
ich hab mir das AddIn auch geladen und angepasst an meine Ideen.
Nur eine Idee bekomme ich im moment nicht umgesetzt:
Kann man auch ein Projekt in der Solution von dem Inkremental Build ausschließen, wenn darin keine änderungen gemacht wurden?
Irgendwo merkt sich das Visual Studio das ja auch.
So das die Versionsnummer nicht erhöht wird.
Grüße Stephan
PS: Ansonsten ein super AddIn
|
|
21.09.2009 02:34 |
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
|
|