Hallo zusammen,
ich habe folgendes Problem.
Ich möchte zur Laufzeit ein Stückchen Code kompilieren und eine Methode daraus ausführen. Dafür gibt es auch ein paar gute Beispiele im Netz , die auf den ersten Schuss auch ganz gut funktionieren. Nur wenn ich in meiner Funktion eine Konvertierung von einem Datentype machen will kommt es zur Fehlermeldung.
Mein Code sieht bislang so aus...
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.ReferencedAssemblies.Add("System.dll");
parameters.CompilerOptions = "/t:library";
StringBuilder sb = new StringBuilder();
sb.AppendLine(@"using System;");
sb.AppendLine(@" public class FlexConverter{");
sb.AppendLine(@" public object Convert(object oVal){");
sb.AppendLine(" object A=Convert.ToInt32(oVal);");
//sb.AppendLine(" object A=\"Hallo\";");
sb.AppendLine(@" return A;");
sb.AppendLine(@" }");
sb.AppendLine(@" }");
CompilerResults result = provider.CompileAssemblyFromSource(parameters, sb.ToString());
if (!result.Errors.HasErrors)
{
object instance = result.CompiledAssembly.CreateInstance("FlexConverter");
MethodInfo info = instance.GetType().GetMethod("Convert");
OutputVal=info.Invoke(instance, new object[] { oVal });
}
oVal ist in meinem Test = "1234"
Wenn ich die Zeile "object A="Hallo";" einbinde statt der Zeile mit der Konvertierung funktioniert alles wie gewünscht.
Mit der Konvertierung bekomme ich folgende Fehlermeldung vom Compiler:
error CS0119: 'FlexConverter.Convert(object)' ist 'Methode' und im angegebenen Kontext nicht gültig.}
Also kurzum, benutze ich die Convert Funktion im dynamischen Code wird der Code nicht mehr Compiliert.
Fehlt mir hier eine Using Anweisung oder was mache ich da falsch?
Hat das eventuell damit zu tun, dass das ganze Konstrukt schon in einer DLL läuft? Bin im moemt etwas Ratlos.
Freue mich über Tips und Hinweise 😃
Gruß
Lars
...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!
IMHO musst du casten, da Convert.ToInt32 einen Wert vom Typ int liefert und kann nicht einer Variable vom Typ object zugewiesen werden.
**:::
Hallo,
der Fehler wird ja schon deutlich beschrieben: > Fehlermeldung:
[error CS0119: 'FlexConverter.Convert(object)' ist 'Methode' und im angegebenen Kontext nicht gültig.
Sprich: Da es sonst eine Namens-Überschneidung deiner Methode mit der Convert-Klasse gibt, musst du die Convert-Klasse explizit angeben, d.h. System.Convert.ToInt32
.
IMHO musst du casten, da Convert.ToInt32 einen Wert vom Typ int liefert und kann nicht einer Variable vom Typ object zugewiesen werden.
Da muss kein cast stattfinden, andersherum (von object
auf int
) wäre es jedoch nötig.
UUUUAAAAAAAAAAAAAAAAAHHHHHHHHHHH
Sarc, du hast natürlich RECHT !!!!!!!!
Dass ich das nicht gesehen habe 😦
Aber da waren Bäume und der Wald , du weißt schon 😃
Ist ja peinlich, aber trotzdem vielen Dank. Ich hab die Fehlermeldung einfach falsch interpretiert.
VIELEN DANK und Gruß
...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!
Nebenbei bemerkt musst du mit solche Sachen recht vorsichtig umgehen.
Keinesfalls darf es dazu kommen, dass User was eingeben können, was dann kompiliert und ausgeführt wird - das wäre eine u.U. verheerende Sicherheitslücke.
Der frühe Apfel fängt den Wurm.
Da hast du natürlich Recht, das muss ich mir noch mal gesondert überlegen, was das Thema Sicherheit angeht. Danke für den Denkanstoß.
...............Es gibt 10 Arten von Menschen ...............
die einen kennen binäre Zahlen, die anderen nicht!!!
Die Frage die sich mir stellt ist welchen Zweck das Ganze hat.
Wäre eine Skriptsprache hier nicht direkt sinnvoller?
Oder gibt es einen guten Grund warum die Code zur Laufzeit generieren und kompilieren willst?
Gerade wegen Manipulationen, ob gutartig oder nicht mal dahingestellt, oder auch Sicherheitslücken würde ich von sowas normalerweise abraten.
Wenn es keinen guten Grund gibt, sollte man von sowas die Finger lassen.
Für 2dynamischen" Code sollte man eher zu Skripsprachen greifen, die dann die Logik ausführen.
Wäre ggf. Power-Shell hier nicht ein besserer Ansatz oder spricht was dagegen?
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.