Übergabe von Parametern an eine dynamisch erstellt

Hallo,

Was muss ich tun, um einer function einen Parameter zu übergeben, die zuvor via (ICodeCompiler CreateCompiler()) kompiliert wurde?

Was ich herausgefunden habe, ist dass ich dazu den „InvokeMember“ brauche, aber der lässt nur den type Object zu, aber ich brauche den type HttpContext.

Was mache ich falsch, oder habe ich was vergessen oder gibt es einen anderen Weg?

Gruss Patrick

Hi Patrick!

Das mit dem InvokeMember ist schon richtig, man kann ja schlecht zum typsicheren Aufruf für jede beliebige Methodensignatur eine eigene Methode liefern :wink:
Beim Aufruf wird dann schon geprüft, ob sich die als object[] übergebenen Parameter auf die von Deiner Methode erwarteten Zieltypen casten lassen.

Du kannst natürlich auch ein Interface definieren, Deine dynamisch generierte Klasse dieses Interface implementieren lassen, dann einfach per Reflection eine Instanz dieser Klasse erzeugen (die Assembly bekommst Du ja schon vom CodeCompiler zurück) und anschließend nur noch mit den Methoden des Interfaces arbeiten - dann sparst Du Dir den ganzen Voodoo mit Invoke’s an jeder Ecke.

Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke Martin,

Leider verstehe ich nicht was du meinst.
Kannst du mir bitte ein Code Beispiel schicken,
zum bessern Verständnis, wenn es dir nicht gerade allzu Grosse umstände macht.

Kurz umrissen was ich eigentlich vorhabe:
Habe einen Webhandler geschrieben der aus verschiedenen Textfiles liest und sie zusammensetzt (Template).
Nun wäre es nicht schlecht eine Offne Schnittstelle zu haben, der am Anfange der Abarbeitung des Codes es erlauben würde per Laufzeit Assembly zu Compilieren (String aus Textfile), was auch wunderbar funktioniert.

Nun habe ich mir überlegt, in die zu Compilierende „Datei“ mit solchen function auszustatten.

 HttpContext \_\_context;
 String \_\_strRetrun ; 

 public HttpContext context{
 set {\_\_context = value;} 
 }
 public String StringReturn{
 get {return strRetrun ;}
 }

Was das ganze einfacher machen würde, da dann innerhalb dieser „Datei“ der HttpContext zu Verfügung steht.

Nur wie gebe ich dem Webhandler an, das sein HttpContext an die oben angeführten function zu übergeben?

Rechtherzlichen Dank im Voraus

Gruss Patrick

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!
Wenn ich das richtig verstanden habe, dann willst Du eine Art dynamisches Plugin haben, das ggf. zur Laufzeit kompiliert wird und dann irgendwas macht.
Am sinnvollsten erscheint mir da:

  1. Definiere Dir ein Interface, das angibt, welche Methoden/Properties eine Implementierung dieses Pluging unterstützen muss:

    public interface IMyPlugin
    {
    // Der von Dir gewünschte HttpContext
    HttpContext Context { get; set; }
    // Eine Methode, die die eigentliche Arbeit macht.
    string PerformConversion(string input);
    }

Dein zur Laufzeit zu übersetzendes Plugin muss dann diese Schnittstelle implementieren:

public class SamplePlugin : IMyPlugin
{
 public SamplePlugin() {}

 private HttpContext \_httpContext;

 public HttpContext Context
 {
 get { return \_httpContext; }
 set { \_httpContext = value; }
 }

 public string PerformConversion(string input)
 {
 // Hier wird dann die eigentliche Verarbeitung des PLugins implementiert
 return "irgendwas";
 }
}

Diesen Sourcecode stopfst Du in den CodeCompiler, z.B. per CompileAssemblyFromSource(), in den CompilerResults steht u.a. die fertige Assembly mit dem übersetzten Plugin.

Im Programm deklarierst Du Dir dann

IMyPlugin pluginInstance;

und instanziierst mit

pluginInstance = (IMyPlugin)compilerResults.CompiledAssembly.CreateInstance("SamplePlugin");

Dann kannst Du mit

pluginInstance.HttpContext = ...;

den Context setzen und die Methode(n) des Plugins entsprechend der in der Schnittstelle definierten Signatur aufrufen.

Idealerweise suchst Du Dir aus der Assembly noch den Typ heraus, der IMyPlugin implementiert und verwendest den statt dem jetzt hartcodierten Klassennamen „SamplePlugin“, aber das würde das Beispiel noch mehr aufblähen. Schau’ Dir mal die Klassen Assembly und Type dazu an.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Vielen Herzlichen Dank Martin, es hat geklappt.
Das war die Lösung.

Gruss Patrick

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]