using System.Reflection;
using System.CodeDom.Compiler;
using Microsoft.CSharp; // and/or Microsoft.VisualBasic;
…
private void button1_Click(object sender, System.EventArgs e)
{
// *** Example form input has code in a text box
string lcCode = this.txtCode.Text;
ICodeCompiler loCompiler = new CSharpCodeProvider().CreateCompiler();
CompilerParameters loParameters = new CompilerParameters();
// *** Start by adding any referenced assemblies
loParameters.ReferencedAssemblies.Add("System.dll");
loParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
// *** Must create a fully functional assembly as a string
lcCode = @"using System;
using System.IO;
using System.Windows.Forms;
namespace MyNamespace {
public class MyClass {
public object DynamicCode(params object[] Parameters) {
" + lcCode +
"} } }";
// *** Load the resulting assembly into memory
loParameters.GenerateInMemory = false;
// *** Now compile the whole thing
CompilerResults loCompiled =
loCompiler.CompileAssemblyFromSource(loParameters,lcCode);
if (loCompiled.Errors.HasErrors) {
string lcErrorMsg = "";
lcErrorMsg = loCompiled.Errors.Count.ToString() + " Errors:";
for (int x=0;x<loCompiled.Errors.Count;x++)
lcErrorMsg = lcErrorMsg + "\rLine: " +
loCompiled.Errors[x].Line.ToString() + " - " +
loCompiled.Errors[x].ErrorText;
MessageBox.Show(lcErrorMsg + "\r\r" + lcCode,
"Compiler Demo");
return;
}
Assembly loAssembly = loCompiled.CompiledAssembly;
// *** Retrieve an obj ref – generic type only
object loObject = loAssembly.CreateInstance("MyNamespace.MyClass");
if (loObject == null) {
MessageBox.Show("Couldn't load class.");
return;
}
object[] loCodeParms = new object[1];
loCodeParms[0] = "West Wind Technologies";
try {
object loResult = loObject.GetType().InvokeMember(
"DynamicCode",BindingFlags.InvokeMethod,
null,loObject,loCodeParms);
DateTime ltNow = (DateTime) loResult;
MessageBox.Show("Method Call Result:\r\r" +
loResult.ToString(),"Compiler Demo");
}
catch(Exception loError) {
MessageBox.Show(loError.Message,"Compiler Demo"); }
}