Skip to content

πŸŽ› Event-Catcher with variety of advanced Actions to service projects, libraries, build processes, runtime environment of the Visual Studio, MSBuild Tools, and …



Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.


Control everything: Visual Studio, MSBuild Tools, CI, and more …

πŸŽ› Event-Catcher with variety of advanced Actions

Event model

to service projects, libraries, build processes, runtime environment of the Visual Studio, MSBuild Tools, and …

Copyright (c) 2013-2022  Denis Kuzmin <> github/3F

γ€Œ @ β˜• 」 LGPLv3


Build status - master VSIX nuget package API

Build history

MvsSln GetNuTool SobaScript E-MSBuild

Why vsSolutionBuildEvent ?

Advanced handler of the most events from MS Visual Studio & MSBuild tools. Full control and flexible multi-actions for basic pre/post events and other additional such as:

  • CommandEvent, Errors, Warnings, Cancel-Build, Output-Build, Transmitter, Logging

Ability to handle events for all subprojects at once from the whole solution as an Solution-Events or individually for each separately.

Various modes for everything:

Supports Advanced MSBuild & SBE-Scripts engine for your awesome ideas.

Provides CI support (TeamCity, AppVeyor, Azure DevOps, ...), Command-Line mode and lot of other features for convenient work with the builds, tests, versioning, IO operations, and so on. See the documentation.

Scheme of vsSolutionBuildEvent projects

Advanced MSBuild

Through E-MSBuild engine.

$(n = 0)       $(desc = "Hello ")
$(n += 3.14)   $(desc += "from vsSBE !")
$(n += $(n))   $(p1 = " Platform is $(Platform)")
$(...:project) - from selected project in your solution
$$(...) ... $$(...:project)
$(tStart = $([System.DateTime]::Parse("2014/01/01").ToBinary()))

$([System.TimeSpan]::FromTicks($([MSBuild]::Subtract($(tNow), $(tStart))))

$(pdir = $(ProjectDir:project))
$(pdir = $(ProjectDir.Replace('\', '/'):project))

#SobaScript -- Extensible Modular Scripting Programming Language.

    #SobaScript in action
#[var v = 1.2.3]
#[$(log = "$(TMP)/v.txt")]

#[($(Configuration) ~= Deb || true)
    #[var tBase     = $([System.DateTime]::Parse('2019/08/01').ToBinary())]
    #[var tNow      = $([System.DateTime]::UtcNow.Ticks)]
    #[var revBuild  = #[$(
    #[var v = $(v).$([MSBuild]::Modulo($(revBuild), $([System.Math]::Pow(2, 14))))]

#[var v = $([System.String]::Format("v{0}\r\n\t", $(v)))]

    #[File write("#[var log]"):> Example #[var v] Generated by a vsSolutionBuildEvent]
    #[IO scall("notepad", "#[var log]")]
catch(err, msg)
    $(err) - Type of Exception
    $(msg) - Error Message

For example, you can even exclude projects from build at runtime:

#[Build projects.find("name").IsBuildable = false]

Capture data from external utilities:

#[var bSha1 = #[IO sout("git", "rev-parse --short HEAD")]]

Work with files and archives:

#[IO copy.file("$(odir)/notes.txt", "$(pDirCIM)bin\\$(cfg)\\", true)]
#[7z pack.files({
            "$(pDirCIM)bin\$(cfg)\*.txt"}, "$(odir)CI.MSBuild_v$(numCIM)_[$(branchSha1)][$(netStamp)].zip")]

+DTE-commands, +Access to all MSBuild properties on the fly, +Conditional statements and lot of other components:

    #[Box iterate(i = 0; $(i) < 10; i += 1): 
}catch{ }]

#[( #[vsSBE events.Pre.item(1).Enabled] || ($(Configuration) == "Release" && $(sysc)) )
    #[Build projects.find("name").IsBuildable = false]
    #[var bSha1 = #[IO sout("git", "rev-parse --short HEAD")]]

... create new in 5 minutes

Processing modes

From simple commands to C# or even msbuild targets:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="">

    <Target Name="Init">
        <!-- ... -->

        Additional properties:

CommandEvent (DTE)

You can also use this to catch all command from VS IDE. Samples:

$(lcGuid = #[DTE events.LastCommand.Guid])
$(lcId   = #[DTE events.LastCommand.Id])

#[($(lcGuid) == "{1496A755-94DE-11D0-8C3F-00C04FC2AAE2}" && $(lcId) == 1627) {
    #[File scall("notepad", "#[var log]", 30)]

Automatic Version Numbering

See our Wizard for automatic code generation or use any custom scripts.

Various environments

You can easily use this with TeamCity, Azure DevOps, AppVeyor, and any other automated environments:


Solution-wide Build events

Pre-Build / Post-Build events for all projects at once or individually for each separately: configure what you need.

Stop build on first error

Immediately stop (at the same time) after the first appearance (compared with StopOnFirstBuildError plugin [?])


Wiki - Contains help for work with plugins, basic examples, syntax, information for develop, and lot of other...

Feel free to improve any our pages. Click [Edit] button or Start new here.

Questions / Bugs / Suggestions / Source Code




[. . .]