What is a Mage and how is it useful?

I continue to see links to the Magician, but I don’t understand specifically what he does and why he is useful / popular. If someone could quickly talk about this, it would be very grateful!

Thanks ~

+6
clickonce mage
source share
3 answers

Mitch Wheat gave an excellent answer, and if you are just starting out with the Magician, read the last link he gives!

I wanted to share some real code to give others help on ClickOnce projects. I found that using MSBUILD from the command line to “create” a deployment is ideal for the automatic build process. I never run the publishing wizard from Visual Studio. Although, I specify almost all the information on the Publish tab in VS, so I do not need to do this from the command line. For example, "Application Files" is that I do not know how to do this on the command line.

THEN after the application is successfully deployed to the server ... I use "Magician" as part of my ClickOnce deployment migration from one server to another (for example, Testing-> Staging-> Production)

For example (a PowerShell script that creates your solution executed from a CruiseControl job):

&"$Env:windir\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe" "C:\Projects\MyCoolApp.sln" /t:clean /t:publish /p:Configuration=Release /p:ApplicationRevision=$Env:CCNETLABEL /p:PublishDir="\\TestServer\MyCoolAppFolder/" /p:PublishUrl="\\TestServer\MyCoolAppFolder/" 

Then, when you want to port the ClickOnce application from "TestServer" to "QAServer" or "Staging" or "Production" ... you need to write a complex script to do this. Here is what I came up with:

 ######################################################################################### # PowerShell Script to Migrate a ClickOnce Deployment from one server to another. # This is my first attempt at PowerShell... pardon the bad or incorrect code. :-) # To run a PowerShell script from CruiseControl.Net: # http://www.cruisecontrolnet.org/projects/ccnet/wiki/PowerShell_Task # NOTE: When doing the initial build, ensure that the ProviderURL and ProviderDir are set. ######################################################################################### $SourceDir = "\\TestServer\MyCoolAppFolder" $DestDir = "\\StagingServer\MyCoolAppFolder" $DeploymentManifestName = "MyCoolApp.application" $DeploymentDestUrl = "file://StagingServer/MyCoolAppFolder" # If your application is one that connects to a database, then likely you want it to point # to a different database depending what environment it been deployed to. # I use a SQL Server connection for this example. $ConnStringName = "MyCoolAppConnectionString" $ConnStringValue = "data source=StagingServerInstance;Initial Catalog=MyCoolAppDB;persist security info=True;user id=Gregg;password=Gregg" # Unfortunately, you *must* specify the publisher when doing Mage, even though you specified it # when you did the original publish, otherwise Mage will change the Publisher value to the # name of your Application. A bug in Mage I suspect. $Publisher = "Gregg Cleland" # Risk: This next line assumes that the pfx certificate file is readily available. # Just be certain it the same key you used when you published originally. $AuthenticationKeyPath = "C:\Projects\MyCoolApp\MyCoolApp_TemporaryKey.pfx" # Note: This references the .NET 3.5 version of mage... the .NET 4.0 version of mage.exe can be found at: # C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe $MAGE = "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\mage.exe" ######################################################################################### # Start off at the source location. Set-Location $SourceDir ######################################################################################### # Get the application manifest directory name and application manifest file name. [xml]$doc = Get-Content $DeploymentManifestName $ns = New-Object Xml.XmlNamespaceManager $doc.NameTable $ns.AddNamespace( "asmv1", "urn:schemas-microsoft-com:asm.v1" ) $ns.AddNamespace( "asmv2", "urn:schemas-microsoft-com:asm.v2" ) $xpath = "/asmv1:assembly/asmv2:dependency/asmv2:dependentAssembly" $appManifestPath = $doc.SelectSingleNode( $xpath, $ns ).codebase # Example: = "Application Files\MyCoolApp_1_0_0_5\MyApp.exe.manifest" $position = $appManifestPath.LastIndexOf('\'); $appManifestDir = $appManifestPath.SubString(0, $position); # Example: "Application Files\MyCoolApp_1_0_0_5" $appManifestFile = $appManifestPath.SubString($position + 1); # Example: "MyCoolApp.exe.manifest" ######################################################################################### # Copy the deployment files and the latest application files to destination. # Note: Do not forget to ensure the CruiseControl Service Logon has permissions to write to destination! # Todo: If robocopy fails, throw "robocopy failed!" Most likely it is an Error 5, Access Denied # b/c the CruiseControl Service logon account doesn't have permission to copy to create/write to destination. $CurrentDir = "$DestDir\$appManifestDir" robocopy "$SourceDir" "$DestDir" /XO robocopy "$SourceDir\$appManifestDir" $CurrentDir /MIR /XO ######################################################################################### # Now that we have copied the latest build, let us navigate down into the destination's # application manifest directory and do some work. Set-Location $CurrentDir ######################################################################################### # Remove the .deploy extension from all files. (Mage will throw an exception if you don't do this) Get-ChildItem -Include *.deploy -Recurse | Rename-Item -NewName { [System.IO.Path]::ChangeExtension($_.Name, "") } ######################################################################################### # Modify the XML in the app.config file per your needs (eg change the connectionStrings) [xml]$doc = Get-Content $AppConfigFileName $node = $doc.SelectSingleNode("configuration/connectionStrings/add[@name='$ConnStringName']") $node.connectionString = $ConnStringValue $xmldocPath = $PWD.ProviderPath # hack to avoid getting the silly namespace prefixed to the path for UNC paths $doc.Save("$xmldocPath\$AppConfigFileName") # For some reason, seems to require the fully qualified path ######################################################################################### # Finally... We get to the part where we use MAGE! # Use MAGE to update the application manifest hash and sign it. &"$MAGE" -Update $appManifestFile -FromDirectory "$CurrentDir" -CertFile $AuthenticationKeyPath ######################################################################################### # Re-Add the ".deploy" extension to all files EXCEPT those that end in "application" or # "manifest". Do this AFTER signing. Get-ChildItem -Recurse | Where-Object { !$_.PSIsContainer -and !$_.Name.EndsWith(".application") -and !$_.Name.EndsWith(".manifest") } | Rename-Item -NewName { $_.Name + ".deploy" } ######################################################################################### # Finally, go back up to the Deployment folder and update the deployment manifest Set-Location "..\..\" &"$MAGE" -Update $DeploymentManifestName -ProviderUrl "$DeploymentDestUrl/$DeploymentManifestName" -AppManifest "$appManifestPath" -Publisher $Publisher -CertFile $AuthenticationKeyPath 
+9
source share

Mage.exe is the command-line tool Manifest Generation and Editing Tool for .NET Framework applications. There is also a version of the user interface MageUI.exe

Typical manual use creates a ClickOnce deployment manifest .

+6
source share

It is used to sign clickonce applications.

0
source share

All Articles