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:
-
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]