Announcing MSBuild Structured Log: record and visualize your builds

I’ve just published a new tool: It is an MSBuild logger that can be passed to MSBuild during a build and it records information about everything that happens in the build. But instead of just dumping everything into a huge text file it preserves the structure and relationships between elements, and lets you save…


Where to Download WPF Performance Suite? (Perforator, Visual Profiler)

I was having trouble finding the WPF performance tools mentioned in this blog: I had to ask around, but here are the links to download the tools (Windows Performance Toolkit Setup): After installing this one, also download and run the patch: When the patch installer prompts, choose “Repair”. Then you can launch…


Added ContentSync command line arguments

I’ve added various command line arguments to the tool I blogged about the last time. The new release is here: Now you can customize what operations to perform: -c       Copy files from source that don’t exist in destination (left-only). -u       Update files that have changed between source and destination. This only overwrites the destination…


EnableVSIPLogging to show VS command info

Found an interesting trick here: Run this .reg file: Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0\General] "EnableVSIPLogging"=dword:00000001 Then in Visual Studio hold Ctrl+Shift and click any menu, toolbar command or context menu item. You will get a message box with the info about the command (like below): ————————— VSDebug Message ————————— Command data:     Guid…


ContentSync – a content-based file copy tool

Suppose you need to sync the contents of two large folders, Source and Destination. Normally robocopy *.* Source Destination /MIR does the job. However even if the byte content of a file didn’t change, but the timestamp did, robocopy will copy the file and change the timestamp of the destination to match the source. This…


Live Writer is open source!

All blog posts in this blog have been posted using Live Writer, a great blogging tool we’ve had for years. However it stopped evolving in recent years and I almost lost hope… but! I’m now posting this from the brand new OpenLiveWriter which I just compiled and built myself! Awesome!!!


An open-source full-fidelity XML parser

A while back I needed to understand XML at a low-level, including whitespace, line breaks and comments. While XLinq is a fantastic and powerful library, it does lack a few things, for instance I noticed it doesn’t preserve whitespace around attributes. Nor does it expose the position/line/column information about the nodes. So I took a…


Why is Environment.CurrentDirectory bad?

It is bad in general for various reasons, but it’s especially bad in build tools and related space (like CI servers and such). MSBuild could have had fine-grained parallelism where it could execute multiple tasks on different threads in parallel within the same process, significantly speeding up builds. However it can’t do that because many…


MSBuild: unnecessary rebuilds because of generated AssemblyAttributes.cs

A surprisingly common cause for unnecessary rebuilds of C# MSBuild projects is an unfortunate design in a part of MSBuild tooling that deals with generating AssemblyAttributes.cs. See for example this bug on Connect: But let us step back. Let’s create a new C# Console Application in Visual Studio and build it with diagnostic verbosity….


How to have a Project Reference without referencing the actual binary

Sometimes you want a project reference from project B to project A to indicate a build-time dependency, but you don’t actually want assembly B to reference assembly A (maybe because it’s a runtime-only dependency or loaded using reflection). Having a project reference is beneficial because you indicate to the build system that in order to…