none
Code Evaluation: Compiling in Memory RRS feed

  • Frage

  • Hallo zusammen,
    ich arbeite derzeit mit Code Evaluation, also Bereitsstellung von VB-Code in einer Textdatei, einlesen derselben, compilieren des Texts in ausführbaren Code. Das Compilieren geschieht sozusagen in den Memory (wird als Compilerparameter angegeben), also das Compilat liegt auf dem Speicher.

    Meine Frage ist die, und ich habe bei vielem Suchen keine Hinweise gefunden, wenn ich bspw. den Code einer Funktion mit Parameterverwendung zyklisch compiliere, wird dann immer wieder eine neue Instanz derselben Funktion erzeugt? Gibt es dann nicht irgendwann einen Speicherkonflikt? Kann man mit einer Art von Dispose vor dem erneuten Erzeugen Speicher freigeben?

    Ich betone, ich bin mit dieser Art Programmierung noch am Anfang, habe aber eine Funktion mit Parameterübergabe zum Laufen gebracht, sodass die richtigen Ergebnisse erhalten wurden.

    Grüße-


    Dietrich

    Montag, 8. Januar 2018 09:59

Alle Antworten

  • Hallo Dietrich,

    Verwendest Du die Klasse VBCodeProvider und die Schnittstelle ICodeCompiler (wie in dieser Anleitung)? Wenn dem so ist, so hilft Dir hoffentlich entweder die using-Anweisung oder der Aufruf der Dispose-Methode (Vererbung von IDisposable) weiter.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 9. Januar 2018 09:53
    Administrator
  • Vielen Dank, Dimitar, für die Antwort!
    Ich verwende am Anfang sozusagen den folgenden Code:

    		Dim comp As ICodeCompiler = New VBCodeProvider().CreateCompiler()
    		Dim cp As CompilerParameters = New CompilerParameters
    		With cp
    			With .ReferencedAssemblies
    				.Add("system.dll")
    				.Add("system.data.dll")
    				.Add("system.xml.dll")
    			End With
    			.GenerateExecutable = False
    			.GenerateInMemory = True
    			.CompilerOptions = "/optimize"
    		End With

    dann später im Programm (Beispiel):

    		Dim eval As clsCodeEvaluator = New clsCodeEvaluator(items)
    		TextBox1.Text = eval.Evaluate("ShowMessage")

    Der Code im ersten Block befindet sich in der Klasse clsCodeEvaluator. Und dort geht ein comp.Dispose nicht.

    Die items sind nur Vorgaben zur Compilierung des Texts.
    D.h., in Textbox1 wird das Ergebnis einer Funktion stehen (in meinem Fall).
    Die Frage ist eben, wenn ich das zyklisch mache, mehrmals im Programmablauf, wo und wie sollte ich ein Dispose machen...

    Grüße-


    Dietrich


    • Bearbeitet dherrmann Dienstag, 9. Januar 2018 15:12
    Dienstag, 9. Januar 2018 11:21