Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine assembly version during a post-build event

Let's say I wanted to create a static text file which ships with each release. I want the file to be updated with the version number of the release (as specified in AssemblyInfo.cs), but I don't want to have to do this manually.

I was hoping I could use a post-build event and feed the version number to a batch file like this:

call foo.bat $(AssemblyVersion) 

However I can't find any suitable variable or macro to use.

Is there a way to achieve this that I've missed?

like image 957
Winston Smith Avatar asked Feb 11 '10 09:02

Winston Smith


People also ask

Where is the information regarding the version of the assembly stored?

Assembly version number The version number is stored in the assembly manifest along with other identity information, including the assembly name and public key, as well as information on relationships and identities of other assemblies connected with the application.

How can you get the assembly version in C#?

I can get the Assembly Version with the following line of code: Version version = Assembly.

What is assembly version?

The Product version of the assembly. This is the version you would use when talking to customers or for display on your website. This version can be a string, like '1.0 Release Candidate'. The AssemblyInformationalVersion is optional. If not given, the AssemblyFileVersion is used.

What is post build event command line?

Pre/Post build events are useful when we wish to perform some operations before/after a project is built. These operations are nothing but the Shell commands being used from the command line. Think of a scenario where we build our library project and its . dll is saved into the Project/bin/Release directory.


2 Answers

If (1) you don't want to download or create a custom executable that retrieves the assembly version and (2) you don't mind editing the Visual Studio project file, then there is a simple solution that allows you to use a macro which looks like this:

@(Targets->'%(Version)')

@(VersionNumber) 

To accomplish this, unload your project. If the project somewhere defines a <PostBuildEvent> property, cut it from the project and save it elsewhere temporarily (notepad?). Then at the very end of the project, just before the end-tag, place this:

<Target Name="PostBuildMacros">   <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">     <Output TaskParameter="Assemblies" ItemName="Targets" />   </GetAssemblyIdentity>   <ItemGroup>     <VersionNumber Include="@(Targets->'%(Version)')"/>   </ItemGroup> </Target> <PropertyGroup>   <PostBuildEventDependsOn>     $(PostBuildEventDependsOn);     PostBuildMacros;   </PostBuildEventDependsOn>       <PostBuildEvent>echo HELLO, THE ASSEMBLY VERSION IS: @(VersionNumber)</PostBuildEvent> </PropertyGroup> 

This snippet has an example <PostBuildEvent> already in it. No worries, you can reset it to your real post-build event after you have re-loaded the project.

Now as promised, the assembly version is available to your post build event with this macro:

@(VersionNumber) 

Done!

like image 157
Brent Arias Avatar answered Oct 11 '22 23:10

Brent Arias


If you prefer scripting these methods might also work for you:

If you are using the post-build event, you can use the filever.exe tool to grab it out of the already built assembly:

for /F "tokens=4" %%F in ('filever.exe /B /A /D bin\debug\myapp.exe') do (   set VERSION=%%F ) echo The version is %VERSION% 

Get filever.exe from here: http://support.microsoft.com/kb/913111

If you are using the pre-build event, you can take it out of the AssemblyInfo.cs file as follows:

set ASMINFO=Properties\AssemblyInfo.cs FINDSTR /C:"[assembly: AssemblyVersion(" %ASMINFO% | sed.exe "s/\[assembly: AssemblyVersion(\"/SET CURRENT_VERSION=/g;s/\")\]//g;s/\.\*//g" >SetCurrVer.cmd CALL SetCurrVer.cmd DEL SetCurrVer.cmd echo Current version is %CURRENT_VERSION% 

This uses the unix command line tool sed, which you can download from many places, such as here: http://unxutils.sourceforge.net/ - iirc that one works ok.

like image 26
Tuinstoelen Avatar answered Oct 11 '22 22:10

Tuinstoelen