myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Code zur Laufzeit compilieren und ausführen...
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Code zur Laufzeit compilieren und ausführen...

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Larsen
myCSharp.de-Mitglied

Dabei seit: 10.07.2006
Beiträge: 192
Herkunft: Dortmund


Larsen ist offline

Code zur Laufzeit compilieren und ausführen...

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
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
Neuer Beitrag 04.04.2016 15:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
vbprogger vbprogger ist männlich
myCSharp.de-Poweruser/ Experte

avatar-1820.gif


Dabei seit: 16.01.2006
Beiträge: 1.694
Entwicklungsumgebung: Visual Studio 2012 Prof.
Herkunft: NRW/DE


vbprogger ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

IMHO musst du casten, da Convert.ToInt32 einen Wert vom Typ int liefert und kann nicht einer Variable vom Typ object zugewiesen werden.
Neuer Beitrag 04.04.2016 15:32 Beiträge des Benutzers | zu Buddylist hinzufügen
Sarc
myCSharp.de-Mitglied

Dabei seit: 29.09.2008
Beiträge: 417
Entwicklungsumgebung: VS 2012


Sarc ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Zitat von vbprogger:
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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Sarc am 04.04.2016 15:36.

Neuer Beitrag 04.04.2016 15:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Larsen
myCSharp.de-Mitglied

Dabei seit: 10.07.2006
Beiträge: 192
Herkunft: Dortmund

Themenstarter Thema begonnen von Larsen

Larsen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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ß
Neuer Beitrag 04.04.2016 15:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.290


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
Neuer Beitrag 04.04.2016 15:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Larsen
myCSharp.de-Mitglied

Dabei seit: 10.07.2006
Beiträge: 192
Herkunft: Dortmund

Themenstarter Thema begonnen von Larsen

Larsen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Da hast du natürlich Recht, das muss ich mir noch mal gesondert überlegen, was das Thema Sicherheit angeht. Danke für den Denkanstoß.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Larsen am 04.04.2016 16:03.

Neuer Beitrag 04.04.2016 16:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.652
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 04.04.2016 21:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Jahre.
Der letzte Beitrag ist älter als 4 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 26.11.2020 04:50