2008-10-02 8 views
21

Ich versuche, etwas Code zur Laufzeit zu generieren, wo ich etwas Boiler-Plate Zeug einlege und der Benutzer darf den tatsächlichen Arbeitscode eingeben. Mein Kesselblech Code sieht etwa so aus:Wie Sie {und} in eine Formatzeichenkette setzen

using System; 

public class ClassName 
{ 
    public double TheFunction(double input) 
    { 
     // user entered code here 
    } 
} 

Idealerweise ich denke, ich möchte string.Format verwenden, um den Benutzercode einzufügen und einen eindeutigen Klassennamen erstellen, aber ich erhalte eine Ausnahme auf dem Format-String, es sei denn es sieht wie folgt aus:

string formatString = @" 
using System; 

public class ClassName 
{0} 
    public double TheFunction(double input) 
    {0} 
     {2} 
    {1} 
{1}"; 

Dann string.Format wie dies nenne ich:

string entireClass = string.Format(formatString, "{", "}", userInput); 

das ist in Ordnung und ich kann mit der Hässlichkeit umgehen {0} und {1} im Format Schnur anstelle von meinem geschweifte Klammern, mit der Ausnahme, dass meine Benutzereingabe jetzt auch keine geschweiften Klammern verwenden kann. Gibt es eine Möglichkeit, die geschweiften Klammern in meiner Formatzeichenfolge zu umgehen oder die geschweiften Klammern im Benutzercode in {0} und {1} umzuwandeln? Ich weiß, dass diese Art von Sache ein Sicherheitsproblem ist, das darauf wartet zu passieren, aber dies ist eine Windows Forms App, die für den internen Gebrauch auf Systemen gedacht ist, die nicht mit dem Netz verbunden sind, so dass das Risiko in dieser Situation akzeptabel ist.

+0

Es ist ein Sicherheitsproblem, weil der Code, den ein Benutzer ausführen könnte, buchstäblich alles sein kann, nicht, weil er mit dem Netz verbunden ist. – MusiGenesis

+0

Eigentlich nein, nur weil der Code irgendetwas sein kann, gibt dem Benutzer nicht die Möglichkeit, etwas zu tun, was er vorher nicht tun konnte. Die App wird im selben Kontext wie der Benutzer ausgeführt, und nur Benutzer mit Zugriff auf den Computer, auf dem sie ausgeführt wird, kann Code einführen. –

Antwort

5

"{{" und "}}"

1

Verdoppeln Sie die Klammern: string.Format("{{ {0} }}", "Hello, World"); würde { Hello, World }

5

produzieren Was Ich glaube du willst das ...

string formatString = @" 
using System; 

public class ClassName 
{{ 
    public double TheFunction(double input) 
    {{ 
     {0} 
    }} 
}}"; 

string entireClass = string.Format(formatString, userInput); 
0

Seien Sie besonders vorsichtig, wer Zugriff auf die Anwendung hat. Eine bessere Lösung könnte darin bestehen, einen einfachen Parser zu erstellen, der nur wenige, begrenzte Befehle erwartet.

+0

Ja, es wird nur 5 oder 6 Leute geben, die jemals Grund haben, diese Anwendung zu benutzen, so wie ich sagte, das Risiko ist sehr akzeptabel. –

Verwandte Themen