views:

4922

answers:

4

Every time I publish the Application in Click Once I get get it to update the revision number by one. Is there any way to get this change automatically to change the version number in AssemblyInfo.cs file (all our error reporting looks at the Assembly Version).

A: 

You'll probably need to create a piece of code that updates AssemblyInfo.cs according to the version number stored in the .csproj file. (The ClickOnce deploy version is stored inside an XML tag.)

You'd then change your .csproj file to run this bit of code when Publish|Release build is performed. The MSBuild folks have blogged about how to perform custom actions during certain build types; check the MSBuild team blog.

Judah Himango
+1  A: 

Steps:

  1. Use external incrementing version number (if you leverage continuous integration server like CC.NET, then it comes from the build label)
  2. Use GlobalVersionInfo.cs (file link-referenced by all projects in your solution) to hold the current version and update it on the build with the AssemblyInfo task from the MSBuild Community tasks
  3. Script mage command-line tool from the .NET SDK to update the click-once manifest, using the same version (see -v and -mv switches)

BTW, nice bonus is that, whenever you automatically publish newer ClickOnce deployment version via the integration script, if you also specify the minimal version to mage.exe (same as version), then every user will be updated automatically on the next application launch.

Rinat Abdullin
+11  A: 

We use Team Foundation Server Team Build and have added a block to the TFSBuild.proj's AfterCompile target to trigger the ClickOnce publish with our preferred version number:

<MSBuild
Projects="$(SolutionRoot)\MyProject\Myproject.csproj"
Properties="PublishDir=$(OutDir)\myProjectPublish\;ApplicationVersion=$(PublishApplicationVersion);Configuration=$(Configuration);Platform=$(Platform)"
Targets="Publish" />

The PublishApplicationVersion variable is generated by a custom MSBuild task to use the TFS Changeset number but you could use your own custom task or an existing solution to get the version number from the AssemblyInfo file.

This could theoretically be done in your project file (which is just an MSBuild script anyway) but I'd recommend against deploying from a developer machine.

I'm sure other CI solutions can handle this similarly.


Edit: Sorry, got your question backwards. Going from the ClickOnce version number to the AssemblyInfo file should be doable. I'm sure the MSBuild Community Tasks (link above) have a task for updating the AssemblyInfo file so you'd just need a custom task to pull the version number from the ClickOnce configuration xml.

However, you may also consider changing your error reporting to include the ClickOnce publish version too:

if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
    Debug.WriteLine(System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion);
}
Jason Stangroome
+3  A: 

I implemented this recently using some custom tasks. An issue I found with implementing this with ClickOnce is that all your dll's are updated. This causes the ClickOnce update to download all the application files every update. This bypasses on of the nice features of the ClickOnce deployment where only the modified files are re-downloaded in an update.

Just something to think about when implementing something like this with ClickOnce.

Todd