Working with C# and HomeSite+

So, I ran into an interesting problem today. I wanted to see if I could use HomeSite+ to compile and run c# programs. HS+ makes it easy to add custom buttons, and it is easy enough to bind a button to an external program. So the first thing I did was add a button to call cfc and pass in %CURRENTFILE% as the argument. However, this simply resulted in a DOS window that appeared for one brief second and then immidiately went away. Not sure of what to do, I decided to switch to a simple bat file:

csc %1
pause

I switched my button to call my bat file and this corrected the “Disappearing DOS” window issue, but it caused another problem. The literal string of the filename, in this case, c:\document and settings\etc, was being passed, and the spaces caused an issue with csc. So, I simply wrapped %1 with quotes. Tada - problem solved.

Or so I thought.

When csc runs, it compiles the file in the same directory that you run csc in. In this case, my bat file was at the root of C, which means the .exe from my c# file ended up in the root directory. Luckily the c# compiler supports an /out: directive that allows you to specify the full path and name of the output file.

However, I was passing in path\foo.cs, and I needed to end up with path\foo.exe. Once again, HS+ came to the rescue. I switched from calling my bat file directly to calling a piece of JavaScript code I created from within HS+. Here is the code:

function Main() {

   var fileName = Application.ActiveDocument.Filename;
   var fileNameEXE = fileName.substring(<FONT COLOR=BLUE>0</FONT>,fileName.length-3) + <FONT COLOR=BLUE>".exe"</FONT>;
   var commandToRun = 'c:\\cs.bat <FONT COLOR=BLUE>"' + fileName + '"</FONT> <FONT COLOR=BLUE>"' + fileNameEXE + '"</FONT>';

<FONT COLOR=GRAY>   //remove extension</FONT>    with (Application) {
      ShellToApp(commandToRun);
   }

}

Basically, I get the current file name, remove the “.cs” and “.exe” to a new version of the file name. I then call my bat file and pass in the name of the file to compile as well as the name of the file to generate. cs.bat simply is:

@echo off
csc /out:%2 %1 /nologo
pause

This now compiled my code and paused so I could see any issues.

Next I wanted to see if I could run the current document. Once again I created a button, and as before, I made it call a JavaScript file:

function Main() {

   var fileName = Application.ActiveDocument.Filename;
   fileName = fileName.substring(<FONT COLOR=BLUE>0</FONT>,fileName.length-3) + <FONT COLOR=BLUE>".exe"</FONT>;

<FONT COLOR=GRAY>   //remove extension</FONT>    with (Application) {
      ShellToApp('c:\\csrun.bat <FONT COLOR=BLUE>"' + fileName + '"</FONT>');
   }

}

As before, I take the current file and remove the .cs and add .exe. This time I call a bat file called csrun.bat, all it does is:

@echo off
call %1
pause

Which basically means, run the file I was given and pause.

So far so good. Now I can compile and run simple programs from HS+. I could also easily modify this to call another compiler, like javac. My next modification will be to make my “run” JS code prompt for input arguments to pass to the c sharp file. Enjoy.

Raymond Camden's Picture

About Raymond Camden

Raymond is a developer advocate looking for his next gig. He focuses on JavaScript, serverless and enterprise cat demos. If you like this article, please consider visiting my Amazon Wishlist or donating via PayPal to show your support.

Lafayette, LA https://www.raymondcamden.com

Comments