Folgenden Aktionen lösen eine zusätzliche Terminierung von einem Addins aus:

-Kompilieren von (geändertem) Code

-Starten einer Debug-session

-Beenden einer Debug-Session



Deswegen würde die zenOn-Objekte „IZenWorkspace“ und „IProject“ mit neuen Events erweitert. Für jede Terminierung gibt es 2 Events. Ein Event wird kurz bevor der Terminierung ansteht getriggert, das 2. Event nachdem eine neue „Session“ für das Addin gestartet wurde.


OnPreVSTADebugStart

Dieser Event wird getriggert kurz bevor eine Debug-Session gestartet wird. Beim Starten einer Debugsession wird das aktive Addin entladen. Referenzen müssen freigegeben werden und e.v. vorhandene Daten gespeichert werden.



OnVSTADebugStart

Dieser Event wird getriggert nachdem eine Debug-Session gestartet wurde. Es wurde eine neue Instanz vom Assembly in einen Debug-Prozess geladen. Mit diesem Event hat man die Möglichkeit Objekt-Referenzen zu setzen.



OnPreVSTADebugStop

Dieser Event wird getriggert kurz bevor eine Debug-Session gestoppt wird. Beim Stoppen einer Debugsession wird das Debug-Addin entladen. Referenzen müssen freigegeben werden und e.v. vorhandene Daten gespeichert werden.



OnVSTADebugStopped

Dieser Event wird getriggert nachdem eine Debug-Session gestoppt wurde. Es wurde eine neue Instanz vom Assembly geladen. Mit diesem Event hat man die Möglichkeit Objekt-Referenzen (neu) zu setzen.



OnPreVSTAUpdate

Dieser Event wird getriggert wann eine neue Version des Assemblys erzeugt wurde. Wann einen Kompile erfolgreich abgeschlossen wird, wird der alte Assembly entladen. Referenzen müssen freigegeben werden und e.v. vorhandene Daten gespeichert werden. Kurz bevor der Assembly entladen wird, wird dieses Event getriggert.



OnPostVSTAUpdate

Dieser Event wird getriggert wann eine neue Version des Assemblys geladen wurde. Referenzen können in diesem Event gesetzt werden.

Grobe Ablaufbeschreibung der Events in der RT ( Anhand VBA):


Beschreibung Abbläufe RT-VBA-> Start, Beenden und Nachladen


Beim RT Start ausgeführt:
Active_Project

Beim RT Beenden ausgeführt:
Inactive_Project


Beim Nachladen ausgeführt:

1. Letzter Zustand ( Variablewerte, usw. ) von der RT wird ein Abbild erzeugt .( mit bestehenden OnlineContainer)


2. Project_FirePreReload() --> Hier sollte man die Referenzen auf Speicherbereiche freigeben. Grund ist, das die Speicherbereiche auf die referenziert wird, beim Reload ungültig werden. Werden diese nicht freigegeben, so kann es passieren, dass im Code ungültige Speicherbereiche verwendet werden.

3. Inactive_Project

4. Projekt mit Inizialwerte wird neu geladen.

5. Active_Project

6. Project_FirePostReload() -> Der letzter Zustand (Abbild) vor dem Nachladen wird wieder hergestellt ( mit bestehenden OnlineContainer). Hier müssen Referenzen auf neue Speicherbereiche wieder hergestellt werden.

Achtung!
Wenn im Active_Project der OnlineContainer wieder erzeugt wird, sind jetzt zwei OnlineContainer vorhanden. Darum braucht man das FirePreReload. Darin sollte ein Flag gesetzt werden, mit dem im Active_Project konntrolliert wird, ob der OnlineContainer wieder erzeugt werden soll oder nicht.
Des Weiteren ist zu beachten, dass während des Reloads nicht auf Projekt-Items zugegriffen werden darf. Es ist hier nur der Zugriff auf das Projekt - "Dach" Objekt möglich.


Sample für thisProject:


#region VSTA_Triggered_Events

///
/// Wird ausgeführt bei RT Start
///

///
///
private void ThisProject_Startup(object sender, EventArgs e)
{
#region Init_VSTA_Events
this.OnPostVSTAUpdate += new zenOn.OnPostVSTAUpdateEventHandler(ThisProject_OnP ostVSTAUpdate);
this.OnPreVSTAUpdate += new zenOn.OnPreVSTAUpdateEventHandler(ThisProject_OnPr eVSTAUpdate);
this.OnPreVSTADebugStart += new zenOn.OnPreVSTADebugStartEventHandler(ThisProject_ OnPreVSTADebugStart);
this.OnVSTADebugStart += new zenOn.OnVSTADebugStartEventHandler(ThisProject_OnV STADebugStart);
this.OnPreVSTADebugStop += new zenOn.OnPreVSTADebugStopEventHandler(ThisProject_O nPreVSTADebugStop);
this.OnVSTADebugStopped += new zenOn.OnVSTADebugStoppedEventHandler(ThisProject_O nVSTADebugStopped);
#endregion
}

///
/// Wird ausgeführt bei RT Beenden
///

///
///
private void ThisProject_Shutdown(object sender, EventArgs e)
{
#region Release_VSTA_Events
this.OnPostVSTAUpdate -= new zenOn.OnPostVSTAUpdateEventHandler(ThisProject_OnP ostVSTAUpdate);
this.OnPreVSTAUpdate -= new zenOn.OnPreVSTAUpdateEventHandler(ThisProject_OnPr eVSTAUpdate);
this.OnPreVSTADebugStart -= new zenOn.OnPreVSTADebugStartEventHandler(ThisProject_ OnPreVSTADebugStart);
this.OnVSTADebugStart -= new zenOn.OnVSTADebugStartEventHandler(ThisProject_OnV STADebugStart);
this.OnPreVSTADebugStop -= new zenOn.OnPreVSTADebugStopEventHandler(ThisProject_O nPreVSTADebugStop);
this.OnVSTADebugStopped -= new zenOn.OnVSTADebugStoppedEventHandler(ThisProject_O nVSTADebugStopped);
#endregion
}

#region Events
///
/// Dieser Event wird getriggert kurz bevor eine Debug-Session gestoppt wird.
/// Beim Stoppen einer Debugsession wird das Debug-Addin entladen.
/// Referenzen müssen freigegeben werden und e.v. vorhandene Daten gespeichert werden.
///

void ThisProject_OnPreVSTADebugStop()
{
this.Cel().WriteCelString("OnPreVSTADebugStop");
}

///
/// Dieser Event wird getriggert nachdem eine Debug-Session gestoppt wurde.
/// Es wurde eine neue Instanz vom Assembly geladen.
/// Mit diesem Event hat man die Möglichkeit Objekt-Referenzen (neu) zu setzen.
///

void ThisProject_OnVSTADebugStopped()
{
this.Cel().WriteCelString("OnVSTADebugStopped")
}

///
/// Dieser Event wird getriggert kurz bevor eine Debug-Session gestartet wird.
/// Beim Starten einer Debugsession wird das aktive Addin entladen.
/// Referenzen müssen freigegeben werden und e.v. vorhandene Daten gespeichert werden.
///

void ThisProject_OnPreVSTADebugStart()
{
this.Cel().WriteCelString("OnPreVSTADebugStart");
}

///
/// Dieser Event wird getriggert nachdem eine Debug-Session gestartet wurde.
/// Es wurde eine neue Instanz vom Assembly in einen Debug-Prozess geladen.
/// Mit diesem Event hat man die Möglichkeit Objekt-Referenzen zu setzen.
///

void ThisProject_OnVSTADebugStart()
{
this.Cel().WriteCelString("OnVSTADebugStart");
}

///
/// Dieser Event wird getriggert wann eine neue Version des Assemblys erzeugt wurde.
/// Wann einen Kompile erfolgreich abgeschlossen wird, wird der alte Assembly entladen.
/// Referenzen müssen freigegeben werden und e.v. vorhandene Daten gespeichert werden. Kurz bevor der Assembly entladen wird, wird dieses Event getriggert.
///

void ThisProject_OnPreVSTAUpdate()
{
this.Cel().WriteCelString("OnPreVSTAUpdate");
}

///
/// Dieser Event wird getriggert wann eine neue Version des Assemblys geladen wurde.
/// Referenzen können in diesem Event gesetzt werden.
///

void ThisProject_OnPostVSTAUpdate()
{
this.Cel().WriteCelString("OnPostVSTAUpdate");
}
#endregion