I can’t believe I did not know this before: it’s possible to set up Visual Studio to use F7 to build the startup project rather than the selected one!
As a matter of fact, that was the default behavior of the F7 key in Visual Studio 6.0, but then in Visual Studio .NET 2003 (or maybe even in 2002?) Microsoft decided to change it to build the selected project rather than the startup one. This change made the build process somewhat inconvenient: if I happened to work with a file that belonged to a DLL and pressed F7, that would build that particular DLL only, while I wanted to build the whole thing – the executable that links to the DLL. In order to do that, I would need to select the EXE project first, then press the F7 key. I don’t know how many microseconds I’ve wasted doing that.
I could have changed the behavior of the F7 key by binding it to the Build.BuildStartupProject command, but the problem was, Visual Studio did not have such a command! The only choices available were: BuildSelection, BuildSolution, and similar, but there was no command to build the startup project. That’s one more thing I cannot believe, that Microsoft has not added such a command for such a long time: it’s still not present in Visual Studio 2008, the latest version as of this writing.
Today, for some reason I got very annoyed by my inability to use the F7 key the way I wanted, so I decided to search for a solution on the Internet, and (miracle!) I’ve found it. I’ll kick myself for a long time for not trying to find it before.
Anyway, the solution is a simple three-line macro I found in the BorisJ’s blog:
Sub BuildStartupProject() Dim sb As SolutionBuild = DTE.Solution.SolutionBuild Dim projName As String = sb.StartupProjects(0) sb.BuildProject(sb.ActiveConfiguration.Name, projName, False) End Sub
As soon as I added it to my custom macros list in Visual Studio, and assigned F7 to run that macro, I could build the current startup project no matter what file I was working with.
One problem I had with the macro was that it did not bring the output window to the foreground when starting the build process, so I added a line that does that.
Another problem was that when I wanted to build for a different platform (such as x64), the macro still compiled for Win32. So I fixed it a bit to make it compile for the correct platform.
Here is the resultant macro :
Sub BuildStartupProject() DTE.ExecuteCommand("View.Output") Dim sb As SolutionBuild = DTE.Solution.SolutionBuild Dim projName As String = sb.StartupProjects(0) sb.BuildProject(sb.ActiveConfiguration.Name + "|" + _ sb.ActiveConfiguration.PlatformName, projName, False) End Sub
Hope this helps someone. Did I mention I can’t believe I have not found this solution long ago? :-)