Visual Studio bietet mit dem ClickOnce Deployment eine praktikable Möglichkeit um ein Release einfach zu deployen und den Kunden zugänglich zu machen. Um die Software vor “Spionen” zu schützten, ist Obfuscation eine oft angewandte Technik. Problematisch wird es jedoch wenn man ein Projekt Obfuscation und mit ClickOnce Deployment veröffentlichen möchte. Der Grund hierfür ist, dass im Zuge des Deploymentprozesses zuerst das Manifest-File erzeugt wird und erst anschließend der Obfuscator seine Arbeit verrichtet. Da im Manifest-File der Hashwerte des Executables gespeichert wird und sich eben dieser Hashwert durch die Obfuscation ändert, stimmen beim Installieren der Hashwert der Datei und der Hashwert im Manifest nicht mehr überein!
Um dieses Problem zu lösen nutzen wir die mage.exe die zusammen mit den .NET Framework-Tools kommt. Mit Hilfe der mage.exe können die Manifest-Files manipuliert bzw. erstellt werden. Mit Hilfe dieses Tools werden wir das Manifest-File reparieren und somit den Hashwert im Manifest aktualisieren. Die Arbeitsschritte sind nun wie folgt:
- OnceClick Deployment einrichten
- Obfuscation für die entsprechenden Projekte aktivieren (bei Obfuscatoren die sich in Visual Studio integrieren meist in den Projekt-Eigenschaften)
- Post-Build Event zum Updaten des Manifests hinzufügen (mit “mage.exe -Update”, siehe unten)
Post-Build Event (wichtig ist, dass der Pfad in dem sich die mage.exe befindet in der PATH-Variable aufgeführt ist):
mage.exe -Update "$(TargetPath).manifest"
Bei der Verwendung von “mage.exe -Update” hatte ich mit den folgenden zwei Problemen zu kämpfen:
- “Warning MSB3178: Assembly ‘xxx.dll’ is incorrectly specified as a file.”: Die Lösung für diesen Fehler habe ich ebenfalls zufällig entdeckt. Die Build-Action für die betreffende DLL in Visual Studio einfach auf None setzten und der Fehler verschwindet!
- Error 9009 beim ausführen des Post-Build Events. Nach einigen Minuten googeln und ärgern, fand ich heraus, dass der volle Pfad zur mage.exe im Post-Build Event angegeben werden muss (obwohl das selbe Kommando in der cmd ohne Problem funktioniert). Also das Post-Build Event sieht also nun so aus:
-
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\mage.exe" -Update "$(TargetPath).manifest"
Soll ein neues Release deployt werden, kann dies wie gewohnt über den “Publish Now” Button unter Publish in den Project-Properties erfolgen.