Listing 5

void Execute(String* f)
{
  String* sCode = CodeBuilder::TheCode(f);

  AppDomain* oAppDomain = AppDomain::CreateDomain("CodeCompilerDomain");

  Byte oAsm[] = LoadFile("..\\debug\\CodeCompiler.dll");
  Assembly* oAssembly = oAppDomain->Load(oAsm);

  DynamicCompilation::CodeCompiler* oJIT = 
                         static_cast <DynamicCompilation::CodeCompiler*>
    (oAssembly->CreateInstance("DynamicCompilation.CodeCompiler"));
  oJIT->SourceCode = sCode;
  CompilerErrorCollection* oErrors = oJIT->CompileCode();
  if (oErrors->Count > 0)
  {
    System::Text::StringBuilder* sb = new System::Text::StringBuilder();
    for (int i=0;i<oErrors->Count;i++)
    {
      sb->Append("Line number: ");
      sb->Append(oErrors->Item[i]->Line.ToString());
      sb->Append(", Error Number: ");
      sb->Append(oErrors->Item[i]->ErrorNumber->ToString());
      sb->Append(", Error Text: ");
      sb->Append(oErrors->Item[i]->ErrorText);
      sb->Append("\r\n");
      Console::WriteLine(sb->ToString());
    }
  }
  else
  {
    Object* oArguments[] = __gc new Object*[1];
    for(double x=0; x<6.3; x=x+0.5)
    {
      oArguments[0] = __box(x);
      try 
      {
        Console::WriteLine(" f({0}) = {1}", x.ToString(),
          oJIT->Invoke("MyFunctoid.MyFunc", "f", oArguments)->ToString());
      }
      catch (Exception* Ex) 
      {
        Console::WriteLine(Ex->ToString());
        break;
      }
    }
  }
  AppDomain::Unload(oAppDomain);
}