Click here to Skip to main content
Click here to Skip to main content

Build solution from command line or with contexmenu item with Microsoft VS.NET

By , 13 Dec 2002
 

Sample Image - builditemincontextmenu.jpg

Introduction

This little article can give you a hint on how you can build your solution files quickly without running 6 Visual Studio applications that enlarge your scratch file till your computer is slow like my grandma.

First of all run %ProgramFiles%\Microsoft Visual Studio .NET\Common7\Tools\vsvars32.bat, if devenv.exe (Visual Studio IDE) could not be found from command line.

Command line switches of devenv.exe

To see this list, type devenv /? on command prompt

  • /build - build the specified solution configuration
  • /project - specifies the project to build instead of solution, must specify /build to use /project
  • /projectconfig - specifies project configuration to build, must specify /project to use /projectconfig
  • /out - write build output to specified file
  • /rebuild - like /build, but forces a clean first
  • /clean - clean up build outputs
  • /deploy - build the specified solution configuration and then deploy it
  • /run - run the specified solution configuration
  • /runexit - run the specified solution configuration and then terminate
  • /command - executes the specified internal command line after startup
  • /mditabs - use tabbed documents interface
  • /mdi - use MDI interface
  • /fn - use specified font name
  • /fs - use specified font size
  • /LCID - use specified language ID
  • /noVSIP - disables VSIP developers license key for VSIP testing
  • /safemode - only default environment and services load for stability
  • /resetskippkgs - allow VSPackages once flagged for loading failures to load again

Console Application BuilderHelper

This little console application is able to check the return value from devenv.exe and we can display the build log if there went something wrong.

The basic method looks like this:

System.Diagnostics.ProcessStartInfo is filled with needed information.

public int Build(string solutionFile, string solutionConfig)
{
    // get temp logfile path
    string logFileName = System.IO.Path.GetTempFileName();
    // populate process environment
    System.Diagnostics.ProcessStartInfo psi = 
        new System.Diagnostics.ProcessStartInfo();
    psi.FileName =@"devenv.exe";
    psi.ErrorDialog = true;
    psi.Arguments =  "\"" +solutionFile +"\"" +  
         @" /rebuild "+ solutionConfig 
         + " /out " + logFileName;

Now we start the process and wait for exit.

// start process
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
// instruct process to wait for exit
p.WaitForExit();
// get return code
int exitCode = p.ExitCode;
// free process resources
p.Close();

If devenv.exe did not return zero, we display the build log to the user.

// if there was a build error, display build log to console
if (exitCode != 0)
{
    System.IO.TextReader reader =  System.IO.File.OpenText(logFileName);
    errorLog = reader.ReadToEnd();
    reader.Close();
    //
    System.Console.WriteLine(errorLog);
    System.Console.WriteLine("Hit enter to abort...");
    System.Console.Read();
}
// delete temp logfile
System.IO.File.Delete(logFileName);

Last but not least, we return the code.

// return process exit code
    return exitCode;
}

Build Batch

  • Create a new text file in the directory where your solution file is located, be sure to change extension from .txt to .bat. If you can't see the extension in your Explorer, change Explorer settings in Tools/Options/View to show extensions.
  • Do not double click the file to edit, use the context menu item Edit or drag it to a text editor like Notepad.
  • Add line VsBuilderHelper.exe solutionfilename.sln solution configuration, where solution configuration is usually debug or release..
  • Save the file and close Notepad.
  • Double click now your *.bat file. If everything went right, the console closes after while, otherwise the build log is displayed.

Extend context menu with build item

  • Open Explorer, open Tools/Options.

File Extension Dialog

  • Change to tab "File Types".
  • Search for sln extension, type sln to find quickly.
  • Click on Extend button (every Windows version has another dialog for this).
  • Click New in the Property Dialog.
  • Choose a name for this item like Build Debug
  • In the path field, type: "VsBuilderHelper.exe" "%1" solution configuration, where solution configuration is usually debug or release. If your VsBuilderHelper.exe is not in the path environment, please specify the full path to VsBuilderHelper.exe.
  • Close the dialogs and go to any solution, right click solution file and choose your menu item. If everything went right, the console closes after a while, otherwise the build log is displayed.

Have phun with it...

Revision History

16.12.2002

  • Fixed bug with project path that contains spaces.
  • Build log stored in temporary file.
  • Console application returns process exit code to caller.

14.12.2002

  • Added console application BuilderHelper.
  • Removed direct devenv call samples.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Chris Richner
Software Developer (Senior) Zeit AG
Switzerland Switzerland
Member
Biography
  • 1996 - 1998 PC Board PPL, HTML, DHTML, Javascript and ASP
  • 1999 - 2001 coding Centura against Sql Database (Centura,MSSQL,Oracle)
  • 2002 - 2004 C# Windows Forms
  • 2005 - 2006 C# ASP.NET, Windows Forms
  • 2006 - 2009 C#, WCF, WF, WPF
  • 2010 - 2012 C#, Dynamics CRM, Sharepoint, Silverlight
  • 2013 - now C#, WCF DS (OData), WF, WPF
Interests
  • family & friends
  • chilaxing ,)
  • coding

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionDoes anybody know how to update web reference in a solution within command line?membergusenica25 Apr '08 - 2:30 
I have some solution those I want to aumatically rebuild but one of them contains web reference that need to update during rebuild process. Using recommendations in this article it is possible to automate rebuild of all solutions but not web references
GeneralMy Versionsusseraserhead16 Oct '03 - 8:21 
It always prints out the log, and it keeps a time stamp.
 
I tried to do a realtime log monitor but VS has a lock on the log file so it can't be read.
 
          public int Build(string solutionFile, string solutionConfig)
          {    
               // get temp logfile path
               string logFileName = System.IO.Path.GetTempFileName();
 
               Console.WriteLine("Building: " + solutionFile);
               Console.WriteLine("Built Started At: " + DateTime.Now);
               DateTime LStartTime = DateTime.Now;
 
               // populate process environment
               System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
               psi.FileName =@"devenv.exe";
               psi.ErrorDialog = true;
               psi.Arguments =   "\"" +solutionFile +"\"" +   @" /rebuild "+ solutionConfig + " /out " + logFileName;
               // start process
               System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
               // instruct process to wait for exit
               p.WaitForExit();
               // get return code
               int exitCode = p.ExitCode;
               // free process resources
               p.Close();
 
               // if there was a build error, display build log to console              
               System.IO.TextReader reader =   System.IO.File.OpenText(logFileName);
               errorLog = reader.ReadToEnd();
               reader.Close();                   
 
               System.Console.WriteLine(errorLog);
              
               Console.WriteLine("devenv.exe returned exit code: " + exitCode);
               Console.WriteLine("Build Ended At: " + DateTime.Now);
               Console.WriteLine("Build Took: " + (DateTime.Now - LStartTime).ToString());
 
               System.Console.WriteLine("Press Enter to Continue...");
               System.Console.Read();
 
               // delete temp logfile
               System.IO.File.Delete(logFileName);
               // return process exit code
               return exitCode;
          }

QuestionDoes anyone know how to display the build log whilst command line builds are in progress?member[DAve]1 May '03 - 0:08 
As the title says... Does anyone know how to display the build log whilst command line builds are in progress?
 
I find it very annoying to just have a cursor blinking at me (I can see it now) when I really want to know how far along the build is.
 
I have tried a tail util on the build log, but that does not work.
 
Anyone any ideas?
 
DAve
 

AnswerRe: Does anyone know how to display the build log whilst command line builds are in progress?membernormanr16 Jul '04 - 4:37 
Basically you have to set the RedirectStandardOutput and RedirectStandardError values of the ProcessStartInfo object to true and then read the StandardOutput and StandardError streams. Make sure this all gets done in a seperate thred otherwise you'll end up locking up the application until devenv finishes.
 
check out the Launching a process and displaying its standard output article for sample code, et. al.
GeneralRe: Does anyone know how to display the build log whilst command line builds are in progress?member[DAve]16 Jul '04 - 4:55 
Woh!
 
That was a reply from the past... I barely remember asking the question Smile | :)
 
The problem has now vanished since recent versions of .NET output to the console that the command line was run from.
 
Thanks for your help though that link was very usefull for another thing I'm looking at.
 
Cheers
 
DAve
GeneralRe: Does anyone know how to display the build log whilst command line builds are in progress?memberM_A_MaDeRo25 Jul '05 - 5:44 
I redirected the StandardOutput and StandarError, I have done this with other processes but with devenv I just get "" "" for both objects. If I dont redirect the output I can see the message in the console windows, but cant get it from there.
Here's my code:
//Somewhere else I call it like:
//return base.Compilar("\""+ pathSolutionFile+"\" /build Debug");

protected string Compilar(string arguments)
{
System.Diagnostics.Process process = new Process();

if(pathCompiladorDirectory != null)
{
process.StartInfo.WorkingDirectory = pathCompiladorDirectory;
process.StartInfo.FileName = pathCompiladorDirectory + ejecutable;
}
else
process.StartInfo.FileName = ejecutable;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
 
process.Start();
 
// Crea una instancia de Teller, nada más para poder tener el proceso en otro Thread.
Teller outputTeller = new Teller(process.StandardOutput);
outputTeller.LeerEvent += new Teller.Leer(outputTeller_LeerEvent);
Thread outputThread = new Thread(new ThreadStart(outputTeller.Lee));
outputThread.Start();
 
Teller errorTeller = new Teller(process.StandardError);
errorTeller.LeerEvent += new Teller.Leer(errorTeller_LeerEvent);
Thread errorThread = new Thread(new ThreadStart(errorTeller.Lee));
errorThread.Start();
 
process.WaitForExit();
process.Close();
while(errorThread.IsAlive || outputThread.IsAlive);
return output + System.Environment.NewLine + error;
///aaaaah!!! tanto pedo nada más para evitar deadlocks
}
protected void errorTeller_LeerEvent(StreamReader reader)
{
error = reader.ReadToEnd();
}
 
protected void outputTeller_LeerEvent(StreamReader reader)
{
output = reader.ReadToEnd();
}
 
protected class Teller
{
public delegate void Leer(StreamReader reader);
public event Leer LeerEvent;
StreamReader reader;
public Teller(StreamReader reader)
{
this.reader = reader;
}

public void Lee()
{
if(LeerEvent!=null)
LeerEvent(reader);
}
}
 

 
The weird thing is that this code is working for other compilers, but not with devenv Frown | :(
 

Generalproblem with devenv.exe (vs.net)membernagash17 Mar '03 - 17:01 
hi guys!
 
i got a problem. vs.net doesnt start.
instead i get an error message.
the pop-up window says: "ms development environment has determined a problem und got to be shut down" (sorry, translation from german version)
"an unhandled exception has been caught by the vsw exception filter."
appname:devenv.exe appver:7.0.9466.0 modname: hxds.dll
modver: 2.1.9466.0 offset: 0001e84f
im anything but skilled with this stuff, maybe one of you guys can help me out.
thank you!

GeneralRe: problem with devenv.exe (vs.net)memberJerry Maguire8 Mar '03 - 2:49 
Hi,
 
hätte die deutsche Meldung auch verstanden ,)
 
could you please give me more detailed information about what you did, i guess you launched the console application via context menu item to build a solution. If you start devenv.exe from command line, everything works as expecteded ? Only if you use the console application it crash ?
 
.:Greets from Jerry Maguire:.
GeneralRe: problem with devenv.exe (vs.net)memberJerry Maguire12 Mar '03 - 5:06 
take a look
 
.:Greets from Jerry Maguire:.
GeneralRunning from IISsussNikolay Simeonov16 Dec '02 - 9:03 
I have a problem trying to run it from the web server. It's weird - if someone is logged on to the console or using terminal client - it works. When noone is logged on - it doesn't.
 
I set all the neccessary permissions etc, but unless I log on to the server "devenv.exe" is freezing - not consuming the CPU, but doesn't do anything and the buildlog.txt file is locked until I kill the process.
 
Do you have any ideas why it happens like that and how can I fix it?
GeneralRe: Running from IISmemberJerry Maguire16 Dec '02 - 11:50 
Hi Nikolay,
 
hmmm, now for every user ( calling ) the buildlog.txt is created in his user profile directory where his permissions are granted.
 
Did you try to start devenv.exe with a batch call ? If devenv.exe then also freeze, it should not be a problem of the console application. No good solution for you, i know. If you find the error please drop me note, thanks.
 
I never try run this little thing on a server, just test it on my client.
 
.:Greets from Jerry Maguire:.
GeneralRe: Running from IISsussNikolay Simeonov16 Dec '02 - 12:01 
The idea is to minimize the uploads neccessary and ease the development over the internet. And I don't want to upload the binaries all the time...
 
It works perfectly as a batch file.
 
It works perfectly when I call it from the console application.
 
It works perfectly when I start the console application from IIS on my machine.
 
It works perfectly when I start the console application on the server from my machine only while I'm logged on to it. Once I log off and the program stops working... isn't that weird ?
 
If you or someone knows why it's freezing I'll be very thankful to learn 'why'.
 
(Eventually if I find a way around or figure out why it happend like that I will let you know) Smile | :)
 
Once again thanks for the article - helped me a lot ( yes, I keep the connection open all the time now Smile | :) )
GeneralRe: Running from IISmemberJerry Maguire16 Dec '02 - 12:16 
Me too ,)
 
please try it with the updated code.
 
Have a nice day
 
.:Greets from Jerry Maguire:.
GeneralProject Path containing SPACEsmemberCoolDude16 Dec '02 - 2:13 
Hi,
i experience problems with the tool if a project path that contains spaces.Cry | :(( After changing on line in the code the tools works for me on those project paths.Smile | :)
 
Orig:
psi.Arguments = solutionFile + @" /rebuild "+ solutionConfig + " /out " + logFileName;
Modified:
psi.Arguments = "\"" +solutionFile +"\"" + @" /rebuild "+ solutionConfig + " /out " + logFileName;
 
Nice tool, thanks and regards, Christian
GeneralRe: Project Path containing SPACEsmemberJerry Maguire16 Dec '02 - 3:55 
Hi,
 
thanks for the hint, i will update the code.
 
Have a nice day
 
.:Greets from Jerry Maguire:.
GeneralREG FilememberRyan Farley10 Dec '02 - 10:07 
You could create a REG file to add this to the registry automatically. I've done this so anytime I install VS, I can just execute the REG file to create the context menu items.
 
Create a text file and add the following text. Then rename the text file to "something.reg". Then to add it to the registry just execute the reg file. This text adds both 'Build Debug' and 'Build Release' to the context menu (using XP reg version 5.00).
 

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Debug]
@="Build Debug"
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Debug\command]
@="\"C:\\Program Files\\Microsoft Visual Studio .NET\\Common7\\IDE\\devenv.exe\" \"%1\" /rebuild Debug"
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Debug\ddeexec]
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Debug\ddeexec\Application]
@="devenv"
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Debug\ddeexec\Topic]
@="System"
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Release]
@="Build Release"
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Release\command]
@="\"C:\\Program Files\\Microsoft Visual Studio .NET\\Common7\\IDE\\devenv.exe\" \"%1\" /rebuild Release"
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Release\ddeexec]
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Release\ddeexec\Application]
@="devenv"
 
[HKEY_CLASSES_ROOT\VisualStudio.Solution\Shell\Build_Release\ddeexec\Topic]
@="System"

 
Anyway, thanks for the article. It is a good idea.
 
-Ryan
GeneralRe: REG FilememberJerry Maguire11 Dec '02 - 12:04 
Hi Ryan,
 
you're right, this is a good reusable solution, like you can see i add a example bat and reg file.
 
At the time i wrote this article, i got the feeling that most people don't like to "work" on the registry just to extend a context menu item. But it's shure a fast and reusable way to do that.
 
thanks
 
.:Greets from Jerry Maguire:.
GeneralGerman Screenshots,memberJerry Maguire9 Dec '02 - 12:14 
Sorry for my bad english and the german screenshots, but i had no english XP/VS.NET by the hand.
 
.:Greets from Jerry Maguire:.
GeneralRe: German Screenshots,memberDaniel Turini9 Dec '02 - 21:12 
Oh, and your keyboard was not working all right, so you needed to change some 'S' for '$', right? Poke tongue | ;-P
 
I see dumb people
GeneralRe: German Screenshots,memberHeath Stewart10 Dec '02 - 1:52 
I agree totally with your point. Microsoft developers shouldn't complain AND develop with Microsoft technologies. It's like having your cake and squashing it too. This is a really tacky approach and someone might mistake you for a linux junkie...or worse yet, a Mac luser!
 
"Well, I wouldn't say I've been missing it, Bob." - Peter Gibbons
GeneralRe: German Screenshots,memberJerry Maguire10 Dec '02 - 2:22 
Hi,
hmmm.. what should i say, i really like microsoft, and my daily business is C# with Visual Studio. I think your feedback isn't really fair.
 
.:Greets from Jerry Maguire:.
GeneralRe: German Screenshots,sussAnonymous10 Dec '02 - 3:04 
I wouldn't worry about it ... too much political correctness has blinded people. And besides, with $36 billion in cash assets I'd say Microsoft was the very definition of ca$h money!!!
GeneralRe: German Screenshots,sitebuilderUwe Keim10 Dec '02 - 6:34 
Nonsense!
 
Writing some "M$" rubbish instead of "Microsoft" just shows your childishness, nothing more.

 
--
- Free Windows-based Web Content Management System: http://www.zeta-software.de/enu/producer/freeware/download.html
- Scanned MSDN Mag ad with YOUR name: www.magerquark.de/misc/CodeProject.html
- See me: www.magerquark.de
GeneralRe: German Screenshots,sussAnonymous10 Dec '02 - 6:36 
Oh lighten up Francis. The guy can say whatever he wants. Not everyone tows the line in the same way. You could easily argue that Microsoft's licensing policies are ALL about the $$$. Blah Blah Blah.
GeneralRe: German Screenshots,sitebuilderUwe Keim10 Dec '02 - 7:00 
So you just confirmed.
 
--
- Free Windows-based Web Content Management System: http://www.zeta-software.de/enu/producer/freeware/download.html
- Scanned MSDN Mag ad with YOUR name: www.magerquark.de/misc/CodeProject.html
- See me: www.magerquark.de

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 14 Dec 2002
Article Copyright 2002 by Chris Richner
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid