MSBuild

Uses E-MSBuild Starting from 1.14. Part of the documentation may be irrelevant. Please update me.

The Microsoft Build Engine which is also known as MSBuild.

This page contains information of how to work with MSBuild in vsSolutionBuildEvent context.

Additional syntax & basic samples are contained below.


  • For work with MSBuild Tools (Microsoft Build Tools) use the CI.MSBuild.
  • For work with MSBuild Targets, Tasks and others, use the Targets Mode.
  • You can also use the SBE-Scripts engine for additional features as a conditions, subcommands, file operations, etc.

 

MSBuild Property & Property Functions

The vsSolutionBuildEvent uses additional syntax for select specific project. This is so because this can be used for all projects at once as Solution-wide (related issue)

Syntax:

$(...)
$(...:project) - from selected project in your solution

To escape an sequences use $:

$$(...) / $$(...:project)

Where '' - is any allowed syntax with MSBuild data. See MSDN.

Samples

vsSBE Result
$([System.Guid]::NewGuid()) 2d2c4ac4-b48d-4509-b42b-aaf6b6047866
$(SolutionDir.Substring(0,3)) d:\
$([System.DateTime]::Now.ToString("yyyy.MM.dd HH:mm:ss")) 2014.06.19 17:32:53
$(EntityDeployIntermediateResourcePath.Substring(0,1):boost) F
$([MSBuild]::GetRegistryValueFromView ('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Silverlight\\v3.0\ReferenceAssemblies', 'SLRuntimeInstallPath', null, RegistryView.Registry64, RegistryView.Registry32)) C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v3.0\
$([System.IO.Path]::Combine($(OS), $(Platform))) Windows_NT\x86
$(MSBuildBinPath)\MSBuild.exe "$(ProjectPath.Replace('', '/'):Version)" /t:Build /p:Configuration=Release C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe "D:/prg/projects/vsSolutionBuildEvent/Version/Version.csproj" /t:Build /p:Configuration=Release
$([System.DateTime]::UtcNow.Ticks) 635645190692933259
$([System.DateTime]::Parse("2015/04/01").ToBinary()) 635634432000000000
$([MSBuild]::GetRegistryValue('HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\Debugger', 'SymbolCacheDir')) C:\Symbols
$(numYmod = $([MSBuild]::Modulo($(numY), 12)))
$([MSBuild]::BitwiseAnd($(mask), $(v))) != 0
$([System.TimeSpan]::FromTicks($([MSBuild]::Subtract($(tNow), $(tStart)))).TotalMinutes.ToString("0"))
$(SolutionPath.Replace('\', '/'))  -> D:\App\ConsoleApp1.sln to D:/App/ConsoleApp1.sln
$(SolutionPath.Replace('\', '\\')) -> to D:\\App\\ConsoleApp1.sln

etc.

$(MSBuildBinPath)\MSBuild.exe "$(ProjectPath.Replace('\', '/'):Version)" /t:Build /p:Configuration=Release  
 &
"$(TargetPath:Version)"  
  "$(SolutionDir)"  
  "$(ProjectDir:mainApp)source.extension.vsixmanifest"

User-variables for MSBuild core

It's a strictly limited version compared with UserVariableComponent (SBE-Scripts core)

Syntax:

$(name = $(...))

In v0.11.4 added strings:

  • ".." - Allows any evaluation inside string. Escaping is a \"
  • '..' - All msbuild containers $() should not be evaluated for this type string. Escaping is a \'

'' and "" used 'as is' for compatibility with MSBuild

$(name = "  - Platform is a $(Platform)  ")

In older versions: Allows definitions only from other variables/properties & property functions.

Samples:

$(start = $([System.DateTime]::Parse("2015/04/01").ToBinary()))
$(pdir = $(ProjectDir:project))
$(pdir = $(ProjectDir.Replace('\', '/'):project))

Global MSBuild properties

  • To define msbuild property via user-variable:
$(+name = ...)

Then, it should be as part of other msbuild properties. Sample for CIM & SlnOpened event:

$(+MyProperty = "val1")
<Target Name="Spec">
    <Message Text="MyProperty = $(MyProperty)" Importance="high" /> 
</Target>
  • To undefine msbuild property via user-variable:
$(-name =)
$(-name = ...)

Syntactic sugar

Increment & Decrement operators for numbers and strings

[ v0.12.8+ ]

  • numbers:
operators equivalent to
$(i += 1) $(i = $([MSBuild]::Add($(i), 1)))
$(i -= 1) $(i = $([MSBuild]::Subtract($(i), 1)))

note: by default, += and -= also initializes variable to 0 if it's not defined before.

Samples:

$(n = 0)
$(n += 3.14)
$(n += $(n))
  • strings:
operators equivalent to
$(name += "str") $(name = $([System.String]::Concat($(name), "str")))

Samples:

$(desc = "Hello ")
$(desc += "world !")

Nested levels - recursive evaluation for MSBuild Properties

In vsSolutionBuildEvent the most variables can be evaluated with nested levels also for each project.

$($(...:$(...)))
$($(...:$($(...:$(...)))))

and similar,

This useful for any dynamic references on your data or additional evaluation with MSBuild. For example:

if you don't put a fixed project name and need link to variable or evaluate some property from specific project in your solution, you can for example:

for v0.11.4+ for older versions:
$(ProjectDir:$(SolutionName)) $($(ProjectDir:$(SolutionName)))
$(ProjectDir:$(ProjectName)) $($(ProjectDir:$(ProjectName)))

and similar… see also related issue - '$(ProjectDir) doesn't resolve properly'

Solution Configuration & Platform

This also has a few differences as part of 'Solution-wide'(see above) features:

Property Description
$(Configuration) Active configuration for solution
$(Configuration:project) Configuration for specific project
$(Platform) Active platform for solution
$(Platform:project) Platform for specific project

Registry Properties

The Registry Properties are allowed in v0.11.4+:

$(registry:Hive\MyKey\M[email protected]) - gets value for ValueName from subkey.
$(registry:Hive\MyKey\MySubKey) - gets the default subkey value.

for older versions you can also use the registry properties but only with a little trick, for example:

#[var k = :Hive\MyKey\MySubKey]
$(registry$(k))
#[var k = :Hive\MyKey\[email protected]]
$(registry$(k))

and similar..

OR you can read system registry values with:

$([MSBuild]::GetRegistryValue('keyName', 'valueName'))
  • MSBuild GetRegistryValueFromView - gets system registry data. The key and value are searched in each registry view(e.g. 32-bit & 64-bit registry view) in order until they are found. Sample of how to look first in the 64-bit then in the 32-bit registry view:
$([MSBuild]::GetRegistryValueFromView('keyName', 'valueName', null, RegistryView.Registry64, RegistryView.Registry32))

Special MSBuild Properties

List of special properties that available as MSBuild Properties.

name description sample of value availability
vsSolutionBuildEvent The version of the vsSolutionBuildEvent engine. 0.12.6.19789 v0.12.6+
vsSBE_LibPath Full path to library. C:\Users\reg\AppData\Local\Microsoft\VisualStudio\14.0\Extensions\qt3l02lc.ntf\ v0.12.8+
vsSBE_CommonPath Common path of library. C:\Users\reg\Documents\Visual Studio 2015\vsSolutionBuildEvent\ v0.12.8+
vsSBE_WorkPath Working path for library. D:\prg\projects\LunaRoad\LunaRoad\ v0.12.8+

References