C#.NET / Scripting mit C#.NET

Scripting mit C#.NET

Scripting mit C#.NET

➪ Mitunter besteht die Notwendigkeit, ein Script als C#.NET-Fragment zu erstellen und auszuführen, ohne die komplette IDE zu laden. Hier ist erforderlich, das Codefragment zur Laufzeit zu ergänzen, zu kompilieren und aufzurufen.

Auf dieser Seite:

Die folgenden Zeilen stellen keinen vollständigen C#.NET-Code dar. Es fehlt eine Klasse, von der ein Objekt instanziiert werden kann, das die Methode MAIN() aufruft.


public void MAIN() {
  System.IO.StreamWriter sw;
  sw = new System.IO.StreamWriter(@"csharpcode_ergebnis__.txt");
  for(int i=0; i<10; i++) 
  {
    Ausgabe(i);
    sw.WriteLine(i);
  }
  sw.Close();
}
public void Ausgabe(int s)
{
  Console.WriteLine("Ausgabe: {0,5}", s);
}

Die Methode public void MAIN() entspricht nicht dem C#-typischen static void Main(string[] args).


namespace CSharpSchulung
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Generierung von C#.NET-Assembly

Das Auslesen der C#.NET-Fragmente, ihre Einbettung in korrekt aufgebauten C#.NET-Code sowie dessen Kompilierung und Aufruf zur Laufzeit ist so möglich:


using System.Text;
using System.IO;
using System.CodeDom.Compiler;
static void Apply_CS_Script(string dateipfad)
{
  Func<string> Get_CS_Code = () =>
  {
    StringBuilder sb = new StringBuilder(
           "using System; 
           namespace CS_Skript 
           { 
            public class Tmpclass 
            { ");
    StreamReader sr = new StreamReader(dateipfad);
    sb.Append(sr.ReadToEnd());
    sr.Close();
    sb.Append(" } }");
    return sb.ToString();
  };
  Func<string, System.Reflection.Assembly> 
  CreateAssemblyFromCode = (code) =>
  {
    CodeDomProvider provider;
    CompilerParameters cparams;
    CompilerResults cresults;
    provider = new Microsoft.CSharp.CSharpCodeProvider();
    cparams  = new CompilerParameters();
    cresults = provider.CompileAssemblyFromSource(
               cparams, code);
    if (cresults.Errors.Count != 0)
    {
      foreach (CompilerError o in cresults.Errors) 
               Console.WriteLine(o);
      return null;
    }
    else return cresults.CompiledAssembly;
  };
  try
  {
    System.Reflection.Assembly a;
    a        = CreateAssemblyFromCode(Get_CS_Code());
    object o = a.CreateInstance("CS_Skript.Tmpclass");
    Type t   = o.GetType();
    System.Reflection.MethodInfo mi = t.GetMethod("MAIN");
    mi.Invoke(o, null);
  }
  catch (Exception exc)
  {
    Console.WriteLine("FEHLER: {0}", exc.Message);
  }
}

wg / 28. Juli 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/cs_scripting.html