VSTO Post Deployment Actions

Das Deployment für VSTO Lösungen funktioniert immer noch mit ClickOnce (MSI geht auch, aber ohne besondere Visual Studio-Unterstützung). Das Security Modell ist ebenfalls gleich geblieben (ClickOnce Security mit signierten Manifesten und Trust Chain). Zwei Dinge sind aber neu: Multi Target Deployment und Post Deployment Actions. Mit letzterem will ich mich in diesem Artikel auseinander setzen.

Wenn nach der eigentlichen Verteilung von AddIns oder anderen VSTO-Lösungen noch weitere Aktionen ausgeführt werden sollen, so war das bisher mit ClickOnce nicht möglich. MSI kennt das Prinzip der Custom Actions. So etwas ähnliches gibt es jetzt bei Click Once – eben jene Post Deployment Actions.

Dazu wird eine neue Klasse dem Projekt hinzugefügt, nennen wir sie einmal PDAClass. Diese Klasse benötigt folgenden Namespace:

   using Microsoft.VisualStudio.Tools.Applications.Deployment;

Von diesem kommt die Definition der Basisklasse, von der unsere Klasse erbt:

   class PDAClass : IAddInPostDeploymentAction

Jetzt muss nur noch die Execute-Methode implementiert werden:

   public void Execute(AddInPostDeploymentActionArgs args)
{

}

Innerhalb der Execute-Methode können Aktionen durchgeführt werden, die im User Context erlaubt sind (ClickOnce-Regel!). Ausgeführt wird der Code nach dem eigentlichen Kopieren bei der ClickOnce-Installation.

 

Das ist allerdings nur die eine Seite der Medaille. Da die Aktivierung des Codes bei der Installation erfolgt (automatisch durch den ClickOnce Mechanismus), müssen wir selbigem auch mitteilen, das da etwas zu tun ist. Das geschieht, indem ein Eintrag ins Application Manifest (.manifest) erfolgt:

Nach dem Statement:

   <vstav3:update enabled="true" />

fügen wir folgendes ein:

   <vstav3:postActions>
<vstav3:postAction>
<vstav3:entryPoint class="MyAddIn.PDAClass">
<assemblyIdentity name="MyAddIn" version="1.0.0.0" language="neutral" processorArchitecture="msil" />
</vstav3:entryPoint>
<vstav3:postActionData></vstav3:postActionData>
</vstav3:postAction>
</vstav3:postActions>

Hierbei muss darauf geachtet werden, dass vstav3:entryPoint class=”<Namespace.Class>” erhält. Außerdem wird assemblyIdentity name="Namespace" und version="1.0.0.0" auf die aktuelle Version der Assembly gesetzt.

Nachdem das Manifest geändert worden ist, stimmt natürlich der beim Signieren erzeugte Hash nicht mehr und beide Manifeste müssen neu signiert werden. Zuerst das Application Manifest und danach das Deployment Manifest (.vsto).

Dazu wird am einfachsten eine Batch-Datei mit folgendem Inhalt erzeugt:

   Mage -sign "<Pfad zum Application Manifest>\MyAddIn.dll.manifest"
            -certfile "<Pfad zum Zertifikatsfile>\MyCert.pfx"
            -pwd <Passwort>

   Mage -update "<Pfad zum Deployment Manifest>\MyAddIn.vsto"
            -appmanifest "<Pfad zum Application Manifest>\MyAddIn.dll.manifest"
            -certfile "<Pfad zum Zertifikatsfile>\MyCert.pfx"
            -pwd <Passwort>

Wichtig: Das verwendete Mage (Manifest Generation Tool) muss das aus dem .NET Framework 4.0 sein.