Gerade wenn man mit MSBuild ClickOnce Pakete bearbeitet (aufbrechen und erneut signiert) muss man darauf aufpassen, dass man die Parameter korrekt an die mage.exe übergibt.
Ich verwende normalerweise in Projekten eine solche Ordnerstruktur

- bin –> Binaries
- bld –> Build Files
- doc –> Dokumentationen
- pkg –> ClickOnce Paket
- src –> Source Files
Hierbei kann es zu Problemen kommen, wenn man davon ausgeht, dass ein Buildfile (im Ordner bld) aus dem Ordner bld heraus aufgerufen wird
c:\dev\bld\msbuild.exe sample_bld.msbuild
Falls man innerhalb des BuildFiles dann zum Beispiel die Ordnerpfade wie folgt zusammenbaut
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0"
InitialTargets="Init"
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<src Condition="'$(src)' ==''">$(MSBuildStartupDirectory)\..\src\</src>
<pkg Condition="'$(pkg)' ==''">$(MSBuildStartupDirectory)\..\pkg\</pkg>
<bin Condition="'$(bin)' ==''">$(MSBuildStartupDirectory)\..\bin\</bin>
<doc Condition="'$(doc)' ==''">$(MSBuildStartupDirectory)\..\doc\</doc>
</PropertyGroup>
<Target Name="Init">
<Message Text="$(src)"/>
<Message Text="$(bin)"/>
<Message Text="$(pkg)"/>
<Message Text="$(doc)"/>
</Target>
</Project>
Entstehen folgende Werte
| Property |
Value |
| src |
C:\dev\MageSample\bld\..\src\ |
| bin |
C:\dev\MageSample\bld\..\bin\ |
| pkg |
C:\dev\MageSample\bld\..\pkg\ |
| doc |
C:\dev\MageSample\bld\..\doc\ |
Genau mit diesen Werten entsteht dann ein Problem mit der mage.exe. Mage kann den Teil “\..\” nicht interpretieren. Leider bekommt man bei der Ausführung der mage.exe mit einem solchen Pfad keine Fehlermeldung. Erst bei der Installation der eigentlichen Anwendung oder beim Update bekommt man dementsprechende Fehler angezeigt, weil im Application-Manifest ein falscher Pfad zum Deployment-Manifest hinterlegt wird.
Doch mit ein wenig Geschick kann man dieses Problem einfach in den Griff bekommen.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0"
InitialTargets="InitDirectories"
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<src Condition="'$(src)' ==''">src\</src>
<pkg Condition="'$(pkg)' ==''">pkg\</pkg>
<bin Condition="'$(bin)' ==''">bin\</bin>
<doc Condition="'$(doc)' ==''">doc\</doc>
</PropertyGroup>
<Target Name="InitDirectories">
<CreateItem Include="$(MSBuildStartupDirectory)\..\">
<Output ItemName="root" TaskParameter="Include"/>
</CreateItem>
<PropertyGroup>
<src>@(root->'%(FullPath)')$(src)</src>
<bin>@(root->'%(FullPath)')$(bin)</bin>
<pkg>@(root->'%(FullPath)')$(pkg)</pkg>
<doc>@(root->'%(FullPath)')$(doc)</doc>
</PropertyGroup>
<Message Text="$(src)"/>
<Message Text="$(bin)"/>
<Message Text="$(pkg)"/>
<Message Text="$(doc)"/>
</Target>
</Project>
Mit dieser Variante erhält man folgende Ergebnisse
| Property |
Value |
| src |
C:\dev\MageSample\src\ |
| bin |
C:\dev\MageSample\bin\ |
| pkg |
C:\dev\MageSample\pkg\ |
| doc |
C:\dev\MageSample\doc\ |
Übergibt man diese dann an mage.exe dann wird das ClickOnce Paket auch korrekt verarbeitet und kann wie gewohnt verwendet werden.