//Name $ C# Directory Compiler //Author $ Dylan Johnston //Date $ November 21, 2007 //Notes $ :D|-< using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Diagnostics; using System.Threading; namespace WindowsApplication3 { public partial class Form1 : Form { public Process p; public TextReader t; public int Last; public Form1() { InitializeComponent(); if ( !Directory.Exists( @"out" ) ) { Directory.CreateDirectory( @"out" ); } Last = 0; } private void button1_Click(object sender, EventArgs e) { //Clear it every time we click the button :D txtMain.Text = ""; int n = 0; string CSType = ""; string[] library = { "", "", "", "", "", "" }; //Has to be a better way! //Make sure we've got a directory! if (folderBrowserDialog1.SelectedPath == "") { txtMain.Text += "Please select a folder!"; return; } //Make sure we've got an output file! (and check if it's a dll or exe) if (txtOut.Text != "" && txtOut.Text.ToLower().EndsWith(".dll") || txtOut.Text.ToLower().EndsWith(".exe")) { txtMain.Text += "Building "; if ( txtOut.Text.ToLower().EndsWith( ".dll" ) ) { txtMain.Text += "library file"; CSType = "dll"; } if ( txtOut.Text.ToLower().EndsWith( ".exe" ) ) { txtMain.Text += "executable file"; CSType = "exe"; } txtMain.Text += " ( " + txtOut.Text + " ) \r\n"; } else { txtMain.Text += "Error:\r\nInvalid output filename :("; return; } //Make sure we've only got 1 period! string[] splits = txtOut.Text.Split('.'); if (splits.Length > 2) { txtMain.Text += "Error:\r\nPlease only use 1 period in the filename!\r\n"; return; } String FLocation = folderBrowserDialog1.SelectedPath; //Make sure settings.cfg exists! try { t = new StreamReader( "settings.cfg" ); } catch ( FileNotFoundException ) { txtMain.Text = "Error:\r\nSettings.cfg not found\r\n"; return; } String Settings = t.ReadLine(); String CSLocation = ""; //Create loop to find all the information in settings.cfg while ( Settings != null ) { //Close if it's null if ( Settings == null ) { txtMain.Text = "Error:\r\nInvalid Config\r\n"; return; } //Check for csc.exe (MSVC C# compiler) if ( Settings.StartsWith( "Location: " ) && Settings.EndsWith( "\\csc.exe" ) ) { CSLocation = Settings.Remove( 0, 10 ); txtMain.Text += "Loading Directory:\r\n" + FLocation + "\r\n\r\n"; } //Check for Librarys else if ( Settings.StartsWith( "Library: " ) && Settings.EndsWith( ".dll" ) ) { library[n] = Settings.Remove( 0, 9 ); txtMain.Text += "Load Library :\r\n" + library[n] + "\r\n"; n++; } //Should happen if there is a blank or wierd settings.cfg else { txtMain.Text += "Error:\r\nInvalid Config\r\n"; return; } //Move the line Settings = t.ReadLine(); } DirectoryInfo DIR = new DirectoryInfo( FLocation ); FileInfo[] files = DIR.GetFiles("*.cs"); //Make sure we got files! if (files.Length == 0) { txtMain.Text += "Error:\r\nCouldn't locate any .cs files :(\r\n"; return; } txtMain.Text += "Located Files:\r\n"; //List files for giggles & shits. foreach(FileInfo fi in files) { txtMain.Text += fi.Name + "\r\n"; } //Arrrrrrr guments. string Arguments = ""; //Now we create the argument to pass to csc.exe if (cbDebug.CheckState == CheckState.Checked) //Are we debugging? Arguments = Arguments + "/define:DEBUG "; if (cbOpt.CheckState == CheckState.Checked) //Are we optimizing? Arguments = Arguments + "/optimize "; if (CSType == "dll") Arguments = Arguments + "/target:library "; else if ( CSType == "exe" && comboBox1.SelectedIndex.Equals( 0 ) ) //app Arguments = Arguments + "/target:winexe "; else if ( CSType == "exe" && comboBox1.SelectedIndex.Equals( 1 ) ) //console Arguments = Arguments + "/target:exe "; //Add library refrences to arguments for ( int a = 0; a < library.Length; a++ ) { if ( library[a].Length > 1 ) Arguments = Arguments + "/r:\"" + library[a] + "\" "; } //Add output file to arguments Arguments = Arguments + "/out:\"" + System.Environment.CurrentDirectory + "/out/" + txtOut.Text + "\" /nologo \"" + FLocation + "\\*.cs\""; txtMain.Text += "\r\nARGUMENTS:\r\n" + Arguments + "\r\n\r\n"; try { p = new Process(); p.StartInfo.FileName = CSLocation; p.StartInfo.CreateNoWindow = true; p.StartInfo.Arguments = Arguments; //LETS MAKE DAT SHIT //Create a StreamReader Here And output error to txtMain p.Start(); p.WaitForExit(); } catch (FileNotFoundException) { //Lame :( txtMain.Text += "Error:\r\ncsc.exe not found!\r\n"; } //Check if compiled. if ( File.Exists( System.Environment.CurrentDirectory + "\\out\\" + txtOut.Text ) ) txtMain.Text += "Success!\r\nCompiled to \\out\\" + txtOut.Text + "\r\n"; else txtMain.Text += "Error\r\nSomething catastrophic!\r\n"; } //For an ease of use lets make this crap go away when we hover over it. private void txtOut_MouseHover(object sender, EventArgs e) { if ( txtOut.Text == "Output File Name" ) txtOut.Text = ""; } private void txtOut_MouseLeave(object sender, EventArgs e) { if ( txtOut.Text == "" ) txtOut.Text = "Output File Name"; } //Load Button private void button2_Click(object sender, EventArgs e) { folderBrowserDialog1.ShowDialog(); } //Trys to restore last used position on the dropdownlist private void OutChange( object sender, EventArgs e ) { if ( txtOut.Text.EndsWith( ".exe" ) ) { comboBox1.Enabled = true; comboBox1.Items.Clear(); comboBox1.Items.AddRange( new object[] { "Application", "Console" } ); comboBox1.SelectedIndex = Last; } else if ( txtOut.Text.EndsWith( ".dll" ) ) { comboBox1.Enabled = true; comboBox1.Items.Clear(); comboBox1.Items.Add( "Library" ); comboBox1.SelectedIndex = 0; } else { comboBox1.Items.Clear(); comboBox1.Items.Add( "<-- :)" ); comboBox1.SelectedIndex = 0; comboBox1.Enabled = false; } } //Save last used position! private void comboBox1_SelectionChangeCommitted( object sender, EventArgs e ) { Last = comboBox1.SelectedIndex; } } }