MSBUILD + MAGE.EXE = ClickOnce (Need some help... Experts welcome :-) )

If anyone has any experience with MSBUILD and Mage.exe to build ClickOnce projects, please let me know if you might be able to help.

I used Mike Bouck’s blog on ClickOnce as a guide. (great post Mike)

I'm having a similar issue from this post in the Microsoft forums: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=664144&SiteID=1

I'm using mage.exe as a part of an MSBuild project.

Here's the error I get when I try to run the application (the highlighted part contains my error summary – included as attachment also): 

PLATFORM VERSION INFO Windows: 5.1.2600.131072 (Win32NT) Common Language Runtime: 2.0.50727.42 System.Deployment.dll: 2.0.50727.42 (RTM.050727-4200) mscorwks.dll: 2.0.50727.42 (RTM.050727-4200) dfdll.dll: 2.0.50727.42 (RTM.050727-4200) dfshim.dll: 2.0.50727.42 (RTM.050727-4200)

SOURCES Deployment url: http://localhost/Flicker.ClickOnce/local/ControlNET.application Server: Microsoft-IIS/5.1 X-Powered-By: ASP.NET Deployment Provider url: http://localhost/Flicker.ClickOnce/Local/ControlNET.application Server: Microsoft-IIS/5.1 X-Powered-By: ASP.NET Application url: http://localhost/Flicker.ClickOnce/Local/ControlNET.exe.manifest Server: Microsoft-IIS/5.1 X-Powered-By: ASP.NET

IDENTITIES Deployment Identity: ControlNET ClickOnce (Local).application, Version=2.2.244.2, Culture=neutral, PublicKeyToken=cd4d78a2e5181877, processorArchitecture=msil Application Identity: ControlNET ClickOnce (Local).exe, Version=2.2.244.2, Culture=neutral, PublicKeyToken=cd4d78a2e5181877, processorArchitecture=msil, type=win32

APPLICATION SUMMARY * Installable application.

ERROR SUMMARY Below is a summary of the errors, details of these errors are listed later in the log. * Activation of http://localhost/Flicker.ClickOnce/local/ControlNET.application resulted in exception. Following failure messages were detected: + Manifest XML signature is not valid. + No signature was present in the subject.

COMPONENT STORE TRANSACTION FAILURE SUMMARY No transaction error was detected.

WARNINGS There were no warnings during this operation.

OPERATION PROGRESS STATUS * [9/1/2006 6:01:32 PM]: Activation of http://localhost/Flicker.ClickOnce/local/ControlNET.application has started. * [9/1/2006 6:01:33 PM]: Processing of deployment manifest has successfully completed. * [9/1/2006 6:01:33 PM]: Installation of the application has started. * [9/1/2006 6:01:33 PM]: Processing of application manifest has successfully completed. * [9/1/2006 6:01:36 PM]: Request of trust and detection of platform is complete.

ERROR DETAILS Following errors were detected during this operation. * [9/1/2006 6:01:43 PM] System.Deployment.Application.InvalidDeploymentException (SignatureValidation) - Manifest XML signature is not valid. - Source: System.Deployment - Stack trace: at System.Deployment.Application.Manifest.AssemblyManifest.ValidateSignature(Stream s) at System.Deployment.Application.ComponentVerifier.VerifyStrongNameAssembly(String filePath, AssemblyManifest assemblyManifest) at System.Deployment.Application.ComponentVerifier.StrongNameAssemblyComponent.Verify at System.Deployment.Application.ComponentVerifier.VerifyComponents at System.Deployment.Application.DownloadManager.DownloadDependencies(SubscriptionState subState, AssemblyManifest deployManifest, AssemblyManifest appManifest, Uri sourceUriBase, String targetDirectory, String group, IDownloadNotification notification, DownloadOptions options) at System.Deployment.Application.ApplicationActivator.DownloadApplication(SubscriptionState subState, ActivationDescription actDesc, Int64 transactionId, TempDirectory& downloadTemp) at System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState subState, ActivationDescription actDesc) at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut) at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state) --- Inner Exception --- System.Security.Cryptography.CryptographicException - No signature was present in the subject.

- Source: System.Deployment - Stack trace: at System.Deployment.Internal.CodeSigning.SignedCmiManifest.Verify(CmiManifestVerifyFlags verifyFlags) at System.Deployment.Application.Manifest.AssemblyManifest.ValidateSignature(Stream s)

COMPONENT STORE TRANSACTION DETAILS No transaction information is available.

Here's what my MSBuild project looks like (I highlighted my MAGE executes and the GenerateManifests... Can't figure out what might be wrong) Also included as attachment:

<Project DefaultTargets="Deploy" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"\>

      <Import Project="Microsoft.Sdc.Common.tasks"/>

      <PropertyGroup>

            <Configuration Condition="'$(Environment)' == ''">Local</Configuration>

            <PublishDir>Publish</PublishDir>

            <SolutionName>ControlNET</SolutionName>

            <SupportUrl>http://tempuri.org</SupportUrl>

            <SigningCert>CambarCodeSigning.pfx</SigningCert>

            <SigningCertPassword>cambar</SigningCertPassword>

            <Company>Cambar Solutions</Company>

      </PropertyGroup>

      <Choose>

            <When Condition=" '$(Environment)'=='Local' ">

                  <PropertyGroup>

                        <SourceDir>bin\Debug</SourceDir>

                        <ConfigDir>Config\Local</ConfigDir>

                        <ClickOnceVirtualRootDir>Flicker.ClickOnce\Local</ClickOnceVirtualRootDir>

                        <ClickOnceUrl>http://localhost/Flicker.ClickOnce/Local/</ClickOnceUrl>

                        <ClickOnceApplicationUrl>$(ClickOnceUrl)$(SolutionName).application</ClickOnceApplicationUrl>

                        <ClickOnceAppTitle>ControlNET ClickOnce (Local)</ClickOnceAppTitle>

                  </PropertyGroup>

            </When>

            <When Condition=" '$(Environment)'=='Dev' ">

                  <PropertyGroup>

                        <SourceDir>bin\Debug</SourceDir>

                        <ConfigDir>Config\Dev</ConfigDir>

                        <ClickOnceVirtualRootDir>Flicker.ClickOnce\Dev</ClickOnceVirtualRootDir>

                        <ClickOnceUrl>http://localhost/Flicker.ClickOnce/Dev/</ClickOnceUrl>

                        <ClickOnceApplicationUrl>$(ClickOnceUrl)$(SolutionName).application</ClickOnceApplicationUrl>

                        <ClickOnceAppTitle>ControlNET ClickOnce (Dev)</ClickOnceAppTitle>

                  </PropertyGroup>

            </When>

            <When Condition=" '$(Environment)'=='Test' ">

                  <PropertyGroup>

                        <SourceDir>bin\Release</SourceDir>

                        <ConfigDir>Config\Test</ConfigDir>

                        <ClickOnceVirtualRootDir>Flicker.ClickOnce\Test</ClickOnceVirtualRootDir>

                        <ClickOnceUrl>http://localhost/Flicker.ClickOnce/Test/</ClickOnceUrl>

                        <ClickOnceApplicationUrl>$(ClickOnceUrl)$(SolutionName).application</ClickOnceApplicationUrl>

                        <ClickOnceAppTitle>ControlNET ClickOnce (Test)</ClickOnceAppTitle>

                  </PropertyGroup>

            </When>

            <When Condition=" '$(Environment)'=='Prod' ">

                  <PropertyGroup>

                        <SourceDir>bin\Release</SourceDir>

                        <ConfigDir>Config\Prod</ConfigDir>

                        <ClickOnceVirtualRootDir>Flicker.ClickOnce\Prod</ClickOnceVirtualRootDir>

                        <ClickOnceUrl>http://localhost/Flicker.ClickOnce/Prod/</ClickOnceUrl>

                        <ClickOnceApplicationUrl>$(ClickOnceUrl)$(SolutionName).application</ClickOnceApplicationUrl>

                        <ClickOnceAppTitle>ControlNET ClickOnce</ClickOnceAppTitle>

                  </PropertyGroup>

            </When>

      </Choose>

      <ItemGroup>

            <SourceFiles Include="$(SourceDir)\**\*.*" Exclude="$(SourceDir)\**\*.pdb;$(SourceDir)\**\*.vshost*"/>

      </ItemGroup>

      <ItemGroup>

            <AppConfigFile Include="$(ConfigDir)\App.config"/>

      </ItemGroup>

      <ItemGroup>

            <GetVersionAssembly Include="$(SourceDir)\$(SolutionName).exe"/>

      </ItemGroup>

      <ItemGroup>

            <ClickOnceLandingPage Include="ClickOnceLandingPage.htm"/>

      </ItemGroup>

      <ItemGroup>

            <BootstrapperFile Include="Microsoft.Net.Framework.2.0">

                  <ProductName>.NET Framework 2.0</ProductName>

            </BootstrapperFile>

      </ItemGroup>

      <ItemGroup>

            <ClickOnceInstallationFiles Include="$(SolutionName).application"/>

            <ClickOnceInstallationFiles Include="$(SolutionName).exe.manifest"/>

            <ClickOnceInstallationFiles Include="setup.exe"/>

            <ClickOnceInstallationFiles Include="default.htm"/>

      </ItemGroup>

      <Target Name="Deploy" DependsOnTargets="PrepareClickOnceDeployment;DeleteVirtualRootFiles;CopyFilesToVirtualRoot"/>

      <Target Name="GetVersion">

            <Message Text="Getting version info..."/>

            <GetAssemblyIdentity AssemblyFiles="@(GetVersionAssembly)">

                  <Output TaskParameter="Assemblies"

                              ItemName="GetVersionAssemblyInfo"/>

            </GetAssemblyIdentity>

      </Target>

      <Target Name="GetPublishContent">

            <Exec Command="rd /s /q $(MSBuildProjectDirectory)\$(PublishDir)"/>

            <Copy  SourceFiles="@(SourceFiles)"

                     DestinationFiles="@(SourceFiles->'$(PublishDir)\%(RecursiveDir)%(Filename)%(Extension)')"/>

            <Copy  SourceFiles="@(AppConfigFile)"

                     DestinationFiles="$(PublishDir)\$(SolutionName).exe.config"/>

            <Copy  SourceFiles="@(ClickOnceLandingPage)"

                     DestinationFiles="default.htm"/>

      </Target>

      <Target Name="PrepareClickOnceDeployment" DependsOnTargets="GetPublishContent;GetVersion">

            <Message Text="Preparing for ClickOnce deployment for version %(GetVersionAssemblyInfo.Version)..."/>

            <CreateItem Include="$(PublishDir)\**\*.*">

                  <Output TaskParameter="Include" ItemName="AppManifestContents"/>

            </CreateItem>

            <ModifyFile

                  Path="default.htm"

                  RegularExpression="#APPLICATION_NAME#"

                  NewValue="$(SolutionName)"

                  Force="true"/>

            <ModifyFile

                  Path="default.htm"

                  RegularExpression="#TITLE#"

                  NewValue="$(ClickOnceAppTitle)"

                  Force="true"/>

            <ModifyFile

                  Path="default.htm"

                  RegularExpression="#VERSION#"

                  NewValue="%(GetVersionAssemblyInfo.Version)"

                  Force="true"/>

            <ModifyFile

                  Path="default.htm"

                  RegularExpression="#COMPANY#"

                  NewValue="$(Company)"

                  Force="true"/>

            <ModifyFile

                  Path="default.htm"

                  RegularExpression="#SUPPORT_URL#"

                  NewValue="$(SupportUrl)"

                  Force="true"/>

            <Exec Command="mage.exe -New Application -TrustLevel FullTrust -ToFile $(SolutionName).exe.manifest -Name "$(ClickOnceAppTitle)" -Version %(GetVersionAssemblyInfo.Version) -FromDirectory $(PublishDir)"/>

            <ModifyFile

              Path="$(SolutionName).exe.manifest"

              RegularExpression="<application />"

              NewValue="<description asmv2:iconFile="$(SolutionName).ico" xmlns="urn:schemas-microsoft-com:asm.v1" /><application />"

              Force="true"/>

            <Exec Command="mage.exe -Sign $(SolutionName).exe.manifest -CertFile $(SigningCert) -Password $(SigningCertPassword)"/>

            <GenerateDeploymentManifest AssemblyName="$(ClickOnceAppTitle).application"

                                                      AssemblyVersion="%(GetVersionAssemblyInfo.Version)"

                                                      DeploymentUrl="$(ClickOnceApplicationUrl)"

                                                      Description="Hagemeyer N.A. ControlNET ERP System"

                                                      Product="$(ClickOnceAppTitle)"

                                                      Publisher="$(Company)"

                                                      SupportUrl="$(SupportUrl)"

                                                      EntryPoint="$(SolutionName).exe.manifest"

                                                      Install="true"

                                                      UpdateEnabled="true"

                                                      UpdateMode="Background"

                                                      OutputManifest="$(SolutionName).application"

                                                      MapFileExtensions="true"/>

            <Exec Command="mage.exe -Sign $(SolutionName).application -CertFile $(SigningCert) -Password $(SigningCertPassword)"/>

            <GetFrameworkSdkPath>

                  <Output TaskParameter="Path" PropertyName="SdkPath" />

            </GetFrameworkSdkPath>

            <GenerateBootstrapper

              ApplicationFile="$(SolutionName).application"

              ApplicationName="$(ClickOnceAppTitle)"

              ApplicationUrl="$(ClickOnceUrl)"

              BootstrapperItems="@(BootstrapperFile)"

              Culture="en"

              FallbackCulture="en-US"

              CopyComponents="true"

              Validate="false"

              Path="$(SdkPath)\Bootstrapper"

              OutputPath="." />

      </Target>

      <Target Name="DeleteVirtualRootFiles">

            <Message Text="Deleting files/directories from $(ClickOnceVirtualRootDir)..."/>

            <Exec Command="del /f /s /q $(MSBuildProjectDirectory)\$(ClickOnceVirtualRootDir)\*.*"/>

      </Target>

      <Target Name="CopyFilesToVirtualRoot" DependsOnTargets="PrepareClickOnceDeployment;DeleteVirtualRootFiles">

            <Message Text="Copying files to $(ClickOnceVirtualRootDir)..."/>

            <Copy  SourceFiles="@(ClickOnceInstallationFiles)"

                     DestinationFiles="@(ClickOnceInstallationFiles->'$(ClickOnceVirtualRootDir)\%(Filename)%(Extension)')"/>

            <Copy  SourceFiles="@(AppManifestContents)"

                     DestinationFiles="@(AppManifestContents->'$(ClickOnceVirtualRootDir)\%(RecursiveDir)%(Filename)%(Extension).deploy')"/>

      </Target>

</Project>

Any idea what I might be missing?

The publish works great in VS2005

Running the Publish target in MSBuild without an MSBuild project, against the csproj file works, but doesn't give me an HTML page to launch with, hence the MSBuild project.

I can't figure out what I might be missing here.

Let me know if anyone might be able to help.

Thanks, Murray Gordon

This article is part of the GWB Archives. Original Author: Murray Gordon

New on Geeks with Blogs