Laden...

[VS2005 Addin] deploy event

Erstellt von MasterOfDesaster vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.970 Views
M
MasterOfDesaster Themenstarter:in
68 Beiträge seit 2005
vor 17 Jahren
[VS2005 Addin] deploy event

Hallo,

ich bin dabei ein Addin zuschreiben für das VS2005, dieses soll reagieren sobald man auf deploy klickt bzw. f5 drückt. Es handelt sich um SmartDevice-Solutions, die vor dem Debuggen erstmal auf da Gerät kopiert werden müssen.

Leider finde ich kein passendes Event dafür 🙁 Deshalb habe ich es wie folgt versucht:


Commands commands = _applicationObject.Commands;
            Command com = null;
            string s = string.Empty;
            foreach (Command c in commands)
            {
                if (c.Name == "Build.Deploy")
                    com = c;
                if (c.Name.IndexOf("Build") == 0)
                    s += c.Name + Environment.NewLine;
            }
            MessageBox.Show(s);
            
            
            CommandEvents events = _applicationObject.Events.get_CommandEvents(com.Guid,com.ID);
            events.BeforeExecute += new _dispCommandEvents_BeforeExecuteEventHandler(events_BeforeExecute);

aber in die Methode events_BeforeExecute() komme ich nie, egal ob ich klicke oder ob ich per F5 das Deployment anstoße.

Warum funktioniert es nicht so? Und wie wie würde es funktionieren? Gibt es vlt. ein eigenes Event, wie z.B. OnDeployStarted 🙂? Gefunden habe ich auf alle Fälle nichts in der MSDN und im Inet

mfg MasterOfDesaster

200 Beiträge seit 2004
vor 17 Jahren

Hallo MasterOfDesaster,

so wie Dein Code ausschaut, wird es in erster Linie daran liegen, dass der Garbage Collector Dein Object vom Typ "CommandEvents" aufräumt. Mit dem Verlassen der Methode wird dieses Object zum Abschuss freigegeben. Das sind aber .NET grundlagen und die sollten schon sitzen. Siehe hierzu auch mein letztzen Artikel im dotnet-magazin "Auf dem Weg zum perfekten Code Editor".

Auf dem Weg zum perfekten Code Editor

Im Namensraum EnvDTE gibt es eine BuildEvents-Schnittstelle die Du für BuildEvents von VS2005 nutzen kannst.

WICHTIG! WICHTIG! So wie Du Dich an ein Event mit einem EventHandler ranhängst, musst Du Dich für eine saubere Add-in Programmerung auch wieder von dem Event abkoppeln. Und zwar dann, wenn das Add-In aus der IDE entladen wird oder wenn es durch das Beenden der IDE ausgeladen wird.

Hier eine Beispielimplementierung:



    public class Connect:IDTExtensibility2
    {
        private EnvDTE80.DTE2 _applicationObject = null;

        private EnvDTE.BuildEvents buildEvents = null;

        #region IDTExtensibility2 Members

        public void OnConnection( object Application , ext_ConnectMode ConnectMode , object AddInInst , ref Array custom )
        {
            _applicationObject = Application as DTE2;

            if ( ConnectMode != ext_ConnectMode.ext_cm_UISetup )
            {
                this.SetupVS2005Events( );
            }
        }

        public void OnStartupComplete( ref Array custom )
        {

        }

        public void OnAddInsUpdate( ref Array custom )
        {

        }

        public void OnBeginShutdown( ref Array custom )
        {

        }

        public void OnDisconnection( ext_DisconnectMode RemoveMode , ref Array custom )
        {
            if ( RemoveMode != ext_DisconnectMode.ext_dm_UISetupComplete )
            {
                this.DisconnectVS2005Events( );
            }
        }


        private void SetupVS2005Events( )
        {
           this.buildEvents = _applicationObject.Events.BuildEvents;
           
           this.buildEvents.OnBuildBegin += new _dispBuildEvents_OnBuildBeginEventHandler(OnBuildBegin);
        }

        private void DisconnectVS2005Events( )
        {
            if(this.buildEvents != null)
                this.buildEvents.OnBuildBegin -= new _dispBuildEvents_OnBuildBeginEventHandler( OnBuildBegin );
        }

        #endregion
    }

HTH
TOM_MUE

M
MasterOfDesaster Themenstarter:in
68 Beiträge seit 2005
vor 17 Jahren

Hallo Tom_Mue:

Ich weiß schon das du den Artikel geschrieben hast, dumm nur das das Heft zu Hause liegt und ich auf Arbeit bin 😁

Das mit dem Event wieder abmelden ist korrekt das ich das nicht habe, aber ansonsten:

ansonsten ist mein events(vom Typ CommandEvents) ja nur eine Referenz auf _applicationObject.Events ... von daher dachte ich würde er das schon noch behalten nach der Methode.

Das Event OnBuild habe ich auch gefunden, und ich suche genau das Pendant für deploy. Leider finde ich es nicht. Ein Deploy ist ein eigenständiger Befehl, zumindest ein eigener Button 😄. Dieser schaut nach ob alles kompiliert ist und kompiliert ggf.
Wenn es in den BuildEvents drinnstünde wäre es zu einfach, da habe ich schon geschaut

aber danke für deine Hilfe

M
MasterOfDesaster Themenstarter:in
68 Beiträge seit 2005
vor 17 Jahren

Ohhhhhhh mannnnnn

jetzt hab ich es gesehen!!!!

vsBuildAction hilft mir doch ein ganzes stück weiter 😁

Danke Danke!!!!!

M
MasterOfDesaster Themenstarter:in
68 Beiträge seit 2005
vor 17 Jahren

Es sieht so aus als bräuchte ich nochmal Hilfe, und zwar möchte ich gern eine Datei händisch "deployen". Ich habe zwar eine Möglichkeit gefunden um händisch den Deploy-Vorgang anzustoßen aber ich möchte gern einfach eine Datei zu den "zu veröffentlichenden Dateien" hinzufügen. Leider hat mir weder Msdn, forum, Google geholfen.

Ich weiß das es in den einstellungen eine Möglichkeit gibt zusätzliche Dateien über das Deploy zu veröffentlichen. Allerdings scheint mir das ungeeignet, da die Dateien von Einstellungen abhängig gemachtn eingetragen werden müssen, muss ich an Einstellungen vom VS2005 ran und habe mich deswegen für ein AddIn entschieden. Jetzt stelle ich den Pfad ein beim öffnen der Solution, aber dann will das Studio logischerweise neuladen, was wieder sehr sehr lange dauert.

Gibt es eine Möglichkeit das anders zu beeinflussen?
Warum ist das eingentlich alles so schlecht dokumentiert in der MSDN?
Gibt es gute Tutorials?

mfg MasterOfDesaster