1 Pluspunkt 0 Minuspunkte

Ich habe diesen Code um C# Code dynamisch zur Laufzeit des Programm auszuführen.

// C#-Code als Zeichenfolge
string code = "using System; class CSharpClass { public Main() { Console.WriteLine(123); } }";

// Compiler-Optionen
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;

// Kompilieren des Codes
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);

// Überprüfen auf Kompilierungsfehler
if (results.Errors.Count == 0)
{
    // Instanz der dynamisch generierten Klasse erstellen und Methode aufrufen
    Type dynamicType = results.CompiledAssembly.GetType("CSharpClass");
    dynamic instance = Activator.CreateInstance(dynamicType);

    // Überprüfen, ob die Methode vorhanden ist, bevor sie aufgerufen wird
    MethodInfo method = dynamicType.GetMethod("Main");
    if (method != null)
    {
        debugger.AddLine((method.Invoke(instance, null)).ToString());
        debugger.Print();
    }
    else
    {
        Console.WriteLine("Die Methode 'Main' wurde nicht gefunden.");
    }
}
else
{
    foreach (CompilerError error in results.Errors)
    {
        Console.WriteLine(error.ErrorText);
    }
}

Kann ich da irgendwie vom C# String Code aus auf Funktionen im Programm selbst zugreifen?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Das erfordert eine etwas andere Vorgehensweise, da du sicherstellen musst, dass die Instanz der Klasse Zugriff auf die Funktionen des Hauptprogramms hat. Hier ist ein Beispiel

// C#-Code als Zeichenfolge
string code = @"
using System;

public class CSharpClass
{
private Action<string> externalFunction;

public CSharpClass(Action<string> externalFunction)
{
this.externalFunction = externalFunction;
}

public void Main()
{
Console.WriteLine(""Hello from dynamically generated class!"");
externalFunction(""Calling external function from dynamic class!"");
}
}";

// Compiler-Optionen
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;

// Kompilieren des Codes
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);

// Überprüfen auf Kompilierungsfehler
if (results.Errors.Count == 0)
{
    // Erstellen der externen Funktion, die von der dynamisch generierten Klasse aufgerufen wird
    Action<string> externalFunction = message => Console.WriteLine("External function called with message: " + message);

    // Instanz der dynamisch generierten Klasse erstellen und Konstruktorparameter übergeben
    Type dynamicType = results.CompiledAssembly.GetType("CSharpClass");
    dynamic instance = Activator.CreateInstance(dynamicType, externalFunction);

    // Überprüfen, ob die Methode vorhanden ist, bevor sie aufgerufen wird
    MethodInfo mainMethod = dynamicType.GetMethod("Main");
    if (mainMethod != null)
    {
        mainMethod.Invoke(instance, null);
    }
    else
    {
        Console.WriteLine("Die Methode 'Main' wurde nicht gefunden.");
    }
}
else
{
    foreach (CompilerError error in results.Errors)
    {
        Console.WriteLine(error.ErrorText);
    }
}

In diesem Beispiel wird die dynamisch generierte Klasse CSharpClass mit einem Konstruktor erstellt, der eine Aktion (Action<string>) als Parameter akzeptiert. Diese Aktion ist die "externe Funktion", auf die du zugreifen möchtest. Bei der Instanziierung von CSharpClass wird die externe Funktion übergeben und später in der Main-Methode der Klasse aufgerufen.

von (716 Punkte)