Laden...

Code zur Laufzeit compilieren und ausführen...

Erstellt von Larsen vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.405 Views
L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 7 Jahren
Code zur Laufzeit compilieren und ausführen...

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!!!

1.696 Beiträge seit 2006
vor 7 Jahren

IMHO musst du casten, da Convert.ToInt32 einen Wert vom Typ int liefert und kann nicht einer Variable vom Typ object zugewiesen werden.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

S
417 Beiträge seit 2008
vor 7 Jahren

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.

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 7 Jahren

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!!!

5.299 Beiträge seit 2008
vor 7 Jahren

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.

L
Larsen Themenstarter:in
192 Beiträge seit 2006
vor 7 Jahren

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!!!

T
2.219 Beiträge seit 2008
vor 7 Jahren

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.