Aktuelle Typ des build-Aktion aus Visual Studio von Microsoft.VisualStudio.Shell.Interop
In einigen Erweiterung setzen wir die IVsUpdateSolutionEvents2
und IVsSolutionBuildManager2 verwendet für die Registrierung von Anrufer mit der AdviseUpdateSolutionEvents
Zum Beispiel, dies wird aufgerufen, bevor alle build-Aktionen haben begonnen:
public int UpdateSolution_Begin(ref int pfCancelUpdate)
{
...
}
Allerdings müssen auch immer die status, oder geben Sie die aktuelle build-Aktionen, wie zum Beispiel: Aufbau/Wiederaufbau/reinigen/bereitstellen
Verfügbar & bekannten Varianten:
BuildEvents
Mit der Veranstaltungen.BuildEvents ich abonnieren kann OnBuildBegin, zum Beispiel:
_buildEvents.OnBuildBegin += new _dispBuildEvents_OnBuildBeginEventHandler((vsBuildScope Scope, vsBuildAction Action) => {
buildType = (BuildType)Action;
});
und verwenden Sie die buildType in alle Orte, da die vsBuildAction bietet alle notwendigen Informationen
aber die UpdateSolution_Begin /UpdateSolution_StartUpdate genannte erste als Priorität die Beratung der Methode, und als Ergebnis die buildType setzt zu spät..
auch wir können mit diesem OnBuildBegin statt UpdateProjectCfg_Begin /UpdateSolution_StartUpdate, aber unser Umgang ist auch notwendig so bald wie möglich mit Priorität Anrufer
IVsUpdateSolutionEvents4
Den IVsUpdateSolutionEvents4.UpdateSolution_BeginUpdateAction bietet die dwAction und feuerte vor jedem update-Aktion beginnt in Lösung zu bauen - vor dem ersten UpdateProjectCfg_Begin
ist es genau das was ich brauche! da dwAction kann ich überprüfen mit der VSSOLNBUILDUPDATEFLAGS
Jedoch 🙁 es erschien in VS2012, unsere Erweiterung unterstützt VS2010 und höher... so müssen auch die Variante für die version 2010
UpdateProjectCfg_Begin
Den IVsUpdateSolutionEvents2.UpdateProjectCfg_Begin bietet auch die dwAction (siehe auch VSSOLNBUILDUPDATEFLAGS) und für 2010-version, aber es ist das gleiche wie das erste BuildEvents-Variante - es ist zu spät für die Handhabung (und nicht ganz passend für unsere Aufgabe)
Frage
Ich kann nicht finden die Dokumentation für diese, jedoch sind die VSSOLNBUILDUPDATEFLAGS
verfügbar für VS2010, so denke ich, sollte die Variante für bekommen dieses als aktuellen Zustand des build-Aktion, e.g als mit __VSHPROPID und GetProperty für IVsHierarchy etc...
ist es möglich ? oder kann ich nur mit OnBuildBegin Abonnement o_O
upd1:
__VSHPROPID4
gefunden mit \VisualStudioIntegration\Common\Inc\vsshell100.h:
enum __VSHPROPID4
{ VSHPROPID_TargetFrameworkMoniker = -2102,
VSHPROPID_ExternalItem = -2103,
VSHPROPID_SupportsAspNetIntegration = -2104,
VSHPROPID_DesignTimeDependencies = -2105,
VSHPROPID_BuildDependencies = -2106,
VSHPROPID_BuildAction = -2107,
VSHPROPID_DescriptiveName = -2108,
VSHPROPID_AlwaysBuildOnDebugLaunch = -2109,
VSHPROPID_FIRST4 = -2109
} ;
typedef /* [public] */ DWORD VSHPROPID4;
so, sah doc. - BSTR __VSHPROPID4.VSHPROPID_BuildAction - ruft die build-Aktion für ein Element
ok, eine gute Nachricht, nächste Schritt... versuchen zu erhalten, zum Beispiel:
object type;
hr.GetProperty((uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID4.VSHPROPID_BuildAction, out type);
denen der hr-Bereich ein, zum Beispiel:
IVsSolutionBuildManager2 sbm = (IVsSolutionBuildManager2)ServiceProvider.GlobalProvider.GetService(typeof(SVsSolutionBuildManager));
IVsHierarchy hr = null;
sbm.get_StartupProject(out hr);
Aber der Typ ist immer null... kann es problem mit der Benachrichtigung(hat nicht stattgefunden), sondern auch ähnliches Ergebnis, wenn verwendet pHierProj von UpdateProjectCfg_Begin /UpdateProjectCfg_Done:
int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, ref int pfCancel)
int UpdateProjectCfg_Done(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, int fSuccess, int fCancel)
die bereits die dwAction...
und. wie zu verwenden VSHPROPID_BuildAction -_- problem mit IVsHierarchy ?
- Nachgehakt: die Hälfte der Zeit, wenn die Leute versuchen, zu Haken in Visual Studio build-Informationen, was Sie wirklich wollen, zu tun ist Haken in MSBuild direkt zu erweitern, Ihre build-system. Was ist das ultimative Ziel, das Sie zu erreichen versuchen?
- siehe hier geplanten Rahmen der build-Aktion für die nächste version
Du musst angemeldet sein, um einen Kommentar abzugeben.
fertig 🙂
Lösung 1
CommandEvents
Mit der EnvDTE.CommandEvents, mit dem wir arbeiten können vor der Verarbeitung IVsUpdateSolutionEvents2 und hören alle eingehenden Befehle, Beispiel:
VSStd97CmdID - {5EFC7975-14BC-11CF-9B2B-00AA00573819}
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.vsstd97cmdid.aspx
VSStd2KCmdID - {1496A755-94DE-11D0-8C3F-00C04FC2AAE2}
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.vsstd2kcmdid.aspx
...
Beispiel:
Nun können wir mit der Art der Aktion in UpdateSolution_Begin, zum Beispiel:
...
etc.
vollständige Beispiel können Sie sehen, in den Quellen (siehe Kommentar wo). Auch denke ich, dass es nicht die beste Variante, aber es ist die Variante für VS2010 und höhere Versionen (auch sollte auf sehr älter 2005 & 2008, glaube ich)...
Für VS2012 und neuere empfehle ich die IVsUpdateSolutionEvents4
So, mein problem ist gelöst.
Anderen besten Varianten ?