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.