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

Evaluate C# Code (Eval Function)

Rate me:
Please Sign up or sign in to vote.
4.74/5 (48 votes)
12 Oct 2005CPOL 418.2K   4.9K   130   35
An example that provides an Eval function for compiling/evaluating C# code at runtime.

Sample Image - EvalCSCode.jpg

Introduction

This example shows an "Eval" function for C# and implements different usages of this evaluate function. The library is written in C# and can be tested with the MainForm in the solution.

Source view

Here you will see all the trick. The code generates a class structure with a basic "function prototype" in which the code to evaluate is filled in. The execution of the function should execute your code:

C#
// Eval > Evaluates C# sourcelanguage
public static object Eval(string sCSCode) {

  CSharpCodeProvider c = new CSharpCodeProvider();
  ICodeCompiler icc = c.CreateCompiler();
  CompilerParameters cp = new CompilerParameters();

  cp.ReferencedAssemblies.Add("system.dll");
  cp.ReferencedAssemblies.Add("system.xml.dll");
  cp.ReferencedAssemblies.Add("system.data.dll");
  cp.ReferencedAssemblies.Add("system.windows.forms.dll");
  cp.ReferencedAssemblies.Add("system.drawing.dll");

  cp.CompilerOptions = "/t:library";
  cp.GenerateInMemory = true;

  StringBuilder sb = new StringBuilder("");
  sb.Append("using System;\n" );
  sb.Append("using System.Xml;\n");
  sb.Append("using System.Data;\n");
  sb.Append("using System.Data.SqlClient;\n");
  sb.Append("using System.Windows.Forms;\n");
  sb.Append("using System.Drawing;\n");

  sb.Append("namespace CSCodeEvaler{ \n");
  sb.Append("public class CSCodeEvaler{ \n");
  sb.Append("public object EvalCode(){\n");
  sb.Append("return "+sCSCode+"; \n");
  sb.Append("} \n");
  sb.Append("} \n");
  sb.Append("}\n");

  CompilerResults cr = icc.CompileAssemblyFromSource(cp, sb.ToString());
  if( cr.Errors.Count > 0 ){
      MessageBox.Show("ERROR: " + cr.Errors[0].ErrorText, 
         "Error evaluating cs code", MessageBoxButtons.OK, 
         MessageBoxIcon.Error );
      return null;
  }

  System.Reflection.Assembly a = cr.CompiledAssembly;
  object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");

  Type t = o.GetType();
  MethodInfo mi = t.GetMethod("EvalCode");

  object s = mi.Invoke(o, null);
  return s;

}

Thanks fly out to:

Credits:

  • Kim Hauser (dave) - Application Developer & System Engineer.

License

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


Written By
Software Developer (Senior)
Switzerland Switzerland
programmer and software junkie since 1991 zurich switzerland

Comments and Discussions

 
QuestionUsing a static method instead Pin
19-Oct-05 20:07
suss19-Oct-05 20:07 
AnswerRe: Using a static method instead Pin
aprenot21-Oct-05 10:17
aprenot21-Oct-05 10:17 
GeneralRe: Using a static method instead Pin
Toli Cuturicu20-Dec-10 11:22
Toli Cuturicu20-Dec-10 11:22 
GeneralExcellent! But Pin
cccccbbbbb19-Oct-05 14:41
cccccbbbbb19-Oct-05 14:41 
GeneralRe: Excellent! But Pin
kim.david.hauser22-Oct-05 0:29
kim.david.hauser22-Oct-05 0:29 
AnswerRe: Excellent! But Pin
Kevan Davis1-Dec-06 11:18
Kevan Davis1-Dec-06 11:18 
GeneralExcellent !! Pin
Tittle Joseph18-Oct-05 19:46
Tittle Joseph18-Oct-05 19:46 
GeneralThanks, but ... Pin
Herman Chelette18-Oct-05 2:33
Herman Chelette18-Oct-05 2:33 
This is certainly an elegant, and beautifuly simple, solution! Thank you for sharing it. However, it would be nice for most of us out here reading it if there were a bit more discussion up front about the problem that it solves. I suspect that it will not be utilized as much as it could be (or rated as high, for that matter!) because many won't realize how powerful it is.

Anyway, thanks again for giving it to us - it surely gets my "5".

Herman Chelette
"Damn the specs! Find the elegant solution!!"
GeneralRe: Thanks, but ... Pin
kim.david.hauser21-Oct-05 9:34
kim.david.hauser21-Oct-05 9:34 
GeneralGreat Job Pin
aprenot13-Oct-05 5:02
aprenot13-Oct-05 5:02 
GeneralRe: Great Job Pin
Anonymous21-Oct-05 9:52
Anonymous21-Oct-05 9:52 

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.