During development of the multi-targeting feature of the next version of MSBuild, we found it convenient to expose a new method for accessing the registry from project and target files.  I hadn't really thought much more about it since we implemented it, but today I needed to make a change to Microsoft.Common.targets for which this new syntax was perfect, so I thought I'd share.

So here's how it works:  suppose there's some value in the registry you're interested in consuming.  Using the 2.0 version of MSBuild, you may have written a task which took the names of the key and value, and output the value of the value (ha, I always think it's funny saying that).  Now, with the 3.5 version of MSBuild, it's very simple.  Say the key you're interested in is "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework" and the value at that key you'd like to retrieve is "InstallRoot".  On my machine, this value is set to "C:\WINDOWS\Microsoft.NET\Framework\".  In your project/targets file - anywhere a property reference is allowed (which is pretty much everywhere), you could obtain this value with the property


This sort of shows off the pieces of the new syntax, which can be described like this

$(Registry:<key name>[@<value name>])

Note the value name is optional - this is because the registry supports a notion of default values.  If you omit the value from the specification, MSBuild will simply retrieve the default value (if it exists).

I think this is a neat new feature which hopefully many of you will find useful.  Enjoy!

[ Author: Jeffery Callahan ]