Click here to Skip to main content
15,881,172 members
Articles / Programming Languages / C#
Article

C# Compiler

Rate me:
Please Sign up or sign in to vote.
4.50/5 (36 votes)
6 Mar 20021 min read 455.8K   7.7K   113   55
A simple C# [VB.NET] compiler without using csc.exe

Sample Image - compiler1.jpg

Introduction

CSCompiler is a simple application for compiling single file C# source code. It was written in C#. Of course I didn't wrote a whole C# compiler. Instead I've used interfaces provided by the .NET platform.

What you have to do in order to have a C# compiler :

  1. Create an instance of CSharpCodeProvider (VBCodeProvider for Visual Basic)
  2. Obtain interface for ICodeCompiler
  3. Provide CompilerParameters for compiler options
  4. Compile source code using CompileAssemblyFromSource method of ICodeCompiler interface
  5. Process CompilerResults
  6. Execute generated application if there were no errors

That's it.

This scenario uses code provided as a string, but you can also use source files. You can also generate an assembly in memory , but generating binary a application is better for viewing 'physical' result of a compiler.

This simple application forces you to type in a main class of the application (it is not so tricky as it could be :( ). The assembly references of CSCompiler application should be enough for most of the simplest applications, but if not you must add more assembly references to CompilerParamters to work fine.

The "Compile and Execute" button code look like :

C#
private void button1_Click(object sender, System.EventArgs e)
{
    CSharpCodeProvider codeProvider = new CSharpCodeProvider();
    // For Visual Basic Compiler try this :
    //Microsoft.VisualBasic.VBCodeProvider

    ICodeCompiler compiler = codeProvider.CreateCompiler();
    CompilerParameters parameters = new CompilerParameters();

    parameters.GenerateExecutable = true;
    if (appName.Text == "")    
    {
        System.Windows.Forms.MessageBox.Show(this, 
                               "Application name cannot be empty");
        return ;
    }

    parameters.OutputAssembly = appName.Text.ToString();

    if (mainClass.Text.ToString() == "")
    {
        System.Windows.Forms.MessageBox.Show(this, 
                               "Main Class Name cannot be empty");
        return ;
    }

    parameters.MainClass = mainClass.Text.ToString();
    parameters.IncludeDebugInformation = includeDebug.Checked;

    // Add available assemblies - this should be enough for the simplest
    // applications.
    foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) 
    {
        parameters.ReferencedAssemblies.Add(asm.Location);
    }

    String code = textBox1.Text.ToString();
    //System.Windows.Forms.MessageBox.Show(this, code);

    CompilerResults results = compiler.CompileAssemblyFromSource(parameters, 
                                                                 code);
            
    if (results.Errors.Count > 0) 
    {
        string errors = "Compilation failed:\n";
        foreach (CompilerError err in results.Errors) 
        {
            errors += err.ToString() + "\n";
        }
        System.Windows.Forms.MessageBox.Show(this, errors, 
                               "There were compilation errors");
    }
    else    
    {
        #region Executing generated executable
        // try to execute application
        try 
        {
            if (!System.IO.File.Exists(appName.Text.ToString())) 
            {
                MessageBox.Show(String.Format("Can't find {0}", appName), 
                                "Can't execute.", MessageBoxButtons.OK, 
                                MessageBoxIcon.Error);
                return;
            }
            ProcessStartInfo pInfo = new ProcessStartInfo(appName.Text.ToString());
            Process.Start(pInfo);
        } 
        catch (Exception ex) 
        {
            MessageBox.Show(String.Format("Error while executing {0}", 
                    appName) + ex.ToString(), "Can't execute.", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        #endregion
                
    }
    
}

If you want to know more about CodeProvider interfaces look at NAnt project at sourceforge.

Credits:

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Poland Poland
At the moment I'm a student at Warsaw University of Technology in Poland.

My programming langugage of choice is C++.
I also like C# and Java.

Comments and Discussions

 
QuestionHello, Sir how I can to deploy windows form database application to other computer Pin
hammad zahid ali9-Sep-14 21:25
hammad zahid ali9-Sep-14 21:25 
Generalfrom where i can get c# compiler. Pin
prav.sharma899-Jun-10 15:58
prav.sharma899-Jun-10 15:58 
GeneralMy vote of 1 Pin
ilke can19-Feb-10 4:05
ilke can19-Feb-10 4:05 
GeneralMy vote of 1 Pin
Paresh Gheewala1-Dec-08 20:21
Paresh Gheewala1-Dec-08 20:21 
GeneralRe: My vote of 1 Pin
Jon_Boy30-Dec-08 14:14
Jon_Boy30-Dec-08 14:14 
Generalprofiling library Pin
Member 403721519-Aug-08 7:25
Member 403721519-Aug-08 7:25 
GeneralC# Compiler Pin
Reza Aghazadeh11-May-08 19:15
Reza Aghazadeh11-May-08 19:15 
GeneralPosting on a dead forum! Pin
max2929724-Jun-07 13:30
max2929724-Jun-07 13:30 
Questioncompiling projects which refer dlls! Pin
samtam26-Jul-06 22:11
samtam26-Jul-06 22:11 
AnswerRe: compiling projects which refer dlls! Pin
shaz jazz26-Jul-06 22:36
shaz jazz26-Jul-06 22:36 
GeneralYou ARE still using csc.exe, albiet indirectly Pin
danah gaz12-Dec-05 14:57
professionaldanah gaz12-Dec-05 14:57 
GeneralBackground console Pin
beroni1-Sep-05 5:58
beroni1-Sep-05 5:58 
GeneralRe: Background console Pin
Wizard_0111-Sep-05 7:49
Wizard_0111-Sep-05 7:49 
GeneralRe: Background console Pin
Hossam™ Ahmed9-Jul-07 8:57
Hossam™ Ahmed9-Jul-07 8:57 
GeneralStrong Name Key Pin
kumagKayo26-Jun-05 20:48
kumagKayo26-Jun-05 20:48 
GeneralRe: Strong Name Key Pin
Wizard_0113-Jul-05 11:17
Wizard_0113-Jul-05 11:17 
GeneralRe: Strong Name Key Pin
kumagKayo13-Jul-05 14:52
kumagKayo13-Jul-05 14:52 
GeneralRe: Strong Name Key Pin
Wizard_0113-Jul-05 19:08
Wizard_0113-Jul-05 19:08 
Generalcompiler , what shall i do ?C# compiler Pin
Anonymous28-Dec-04 2:50
Anonymous28-Dec-04 2:50 
GeneralUncompiled Code Execution at Runtime Pin
patsissons10-Dec-04 21:32
patsissons10-Dec-04 21:32 
Generalc# compiler research work Pin
Ninoil Aguilar12-Jul-04 19:57
sussNinoil Aguilar12-Jul-04 19:57 
GeneralUnload a DLL Reference in VB.NET Pin
elRaptor24-Dec-03 9:14
elRaptor24-Dec-03 9:14 
Hello all:
I hope someone cant help me, I am trying to recompile a DLL thats allready loaded to my application and when a try to delete or rewrite the file it trows and error, this is because the file is in use, so I want to now If there is a way to Unload this DLL from the references and then be abble to modify the file.

Thanks on Advance
JA
GeneralRe: Unload a DLL Reference in VB.NET Pin
Princesse10-Feb-05 11:51
Princesse10-Feb-05 11:51 
Generalwhere can i get c# compiler and editor? pls! Pin
Wai Myo16-Jul-03 17:03
Wai Myo16-Jul-03 17:03 
GeneralRe: where can i get c# compiler and editor? pls! Pin
createdbyx22-Jul-03 19:22
createdbyx22-Jul-03 19:22 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.