2010-06-11 27 views
6

Ich muss ein Programm erstellen, das zwar ein anderes Programm erstellt, aber keinen Compiler.Ein Programm, das ein anderes Programm erstellt

Zum Beispiel

Ich schreibe ein Programm, das eine String Eingabe vom Benutzer akzeptiert. Nehmen wir an, Benutzer geben "Pluto" ein. Dieses Programm sollte dann eine separate .exe erstellen, die bei der Ausführung "Hallo Pluto" sagt.

Wie kann ich das tun? Wenn Sie in C# und Windows Forms Beispiele geben könnten, ist es besser.

Danke.

+5

Können Sie uns zeigen, was Sie bisher bei dieser Hausaufgabe gemacht haben? – 48klocs

+4

Sieht sehr nach einer Code-für-mich-Frage aus ... – Dykam

+7

Ich wollte sagen "das ist keine Hausaufgabe", aber ich dachte, ihr würdet mir den Vorteil des Zweifels geben. Ich bin schon 27 Jahre alt. Es ist nicht "Code für mich" Frage. Das Problem, dem ich gegenüberstehe, ist wirklich viel größer, aber ich reduziere das Problem auf die einfache Frage oben. – zaidwaqi

Antwort

14

Grundsätzlich ist ein Compiler - nur für eine besonders einfache Sprache.

Wenn Sie das endgültige Programm in C# ausdrücken können, ist die einfachste Lösung, CSharpCodeProvider zu verwenden. Das ist es, was ich für Snippy mache, ein kleines Tool, um Code-Schnipsel einfach für C# in Depth auszuführen. Der Quellcode zu Snippy ist on the C# in Depth web site und kann Ihnen eine Idee geben, was Sie tun könnten - im Grunde würden Sie nur wollen, dass es die ausführbare Datei in eine Datei schreibt, anstatt sie im Speicher zu erstellen.

Alternativ sehen Sie sich die MSDN docs an, die ein Beispiel zum Generieren einer ausführbaren Datei haben.

+0

@Downvoters: Möchten Sie einen Grund angeben? –

+0

upvoted nur um es zu wollen. Wenn Sie über die Titelseite schauen, wird einfach alles, was er sieht, abgelehnt. – Femaref

+2

etwas downvotes alles. Schau dir die Fragenliste an. Viele gute Fragen werden abgelehnt. Bitte hör auf diesen Bot! –

11

Die Klassen, die Sie suchen, sind im Microsoft.CSharp Namespace

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = true; 
parameters.OutputAssembly = Output; 
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString); 

(von microsoft support mit Hilfe von Google gefunden - in weniger als 20 Sekunden)

+3

Vorsicht, um einen Grund für den Downvote zu geben? – Femaref

+0

Leute, die richtige Antworten ablehnen, wollen, dass ich diese Downvoter herabsetze. – Dykam

+0

Bitte verwenden Sie keine gönnerhaften Text in der Antwort in Bezug auf Google. Der ganze Sinn von stackoverflow.com ist es, Google nicht zu benutzen und hier eine Codierungsreferenz zu haben. Warum benutzen wir nicht alle Google? –

3

Zaghaft, können Sie auch diese Throught achive er verwenden von Dingen im Namespace System.Reflection.Emit und ich glaube, dass es möglich ist, die Implementierung einer Methode durch die Verwendung von LINQ-Ausdrucksbäumen bereitzustellen. Welche ist eine Art ordentlich:

var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("TestAssembly"), AssemblyBuilderAccess.RunAndSave); 
var mod = assembly.DefineDynamicModule("TestModule"); 
var type = mod.DefineType("TestType"); 
var method = type.DefineMethod("Increment", MethodAttributes.Public, typeof(int), Type.EmptyTypes); 
Expression<Func<int, int>> inc = (a) => a + 1; // this is cool 
inc.CompileToMethod(method); 

Es könnte ein bisschen auf den ersten entmutigend aussehen, aber es ist wirklich coole Sachen, und Sie lassen den Compiler die harten Sachen, die Methode Implementierung generieren. Aber Sie können Felder wie dieses nicht wirklich erstellen, das erfordert etwas IL. Was sehr viel Spaß macht, aber wirklich mühsame Arbeit.

HAFTUNGSAUSSCHLUSS:

ich nicht den obigen Code auszuführen versucht. Aber ich weiß, es geht so, es ist schon eine Weile her, seit ich so etwas gemacht habe.

0

Die einfachste Sache zu zu tun wäre, erstelle (im voraus) ein wirklich kurzes einfaches Programm, das eine Ressource von sich liest und ausdruckt. Dann muss Ihre Anwendung diese Programm-Binärdatei nur irgendwo auf der Festplatte ablegen und die UpdateResource-Funktion aufrufen, um die Zeichenfolge zu ändern. .NET unterstützt auch Ressourcen, aber ich kenne keine Funktion, die UpdateResource direkt entspricht.

Verwandte Themen