2010-06-11 22 views
6

Necesito crear un programa que cree otro programa pero no un compilador.Un programa que crea otro programa

Por ejemplo,

escribo un programa que acepta una entrada de cadena del usuario. Digamos que el usuario ingrese "Plutón". Este programa debería crear un .exe por separado que diga "Hola Plutón" cuando se ejecute.

¿Cómo puedo hacer esto? Si pudieras dar un ejemplo en C# y Windows Forms, es mejor.

Gracias.

+5

¿Podría mostrarnos lo que ha hecho en esta tarea hasta el momento? – 48klocs

+4

Se parece mucho a una pregunta de código para mí ... – Dykam

+7

Quería decir "esto no es tarea", pero pensé que ustedes me darían el beneficio de la duda. Ya tengo 27 años. No es una pregunta de "código para mí". El problema que enfrento es mucho más grande, pero reduzco el problema a la simple pregunta anterior. – zaidwaqi

Respuesta

14

Básicamente, es un compilador, solo para un lenguaje particularmente simple.

Si puede expresar el programa final en C#, la solución más fácil es, probablemente, utilizar CSharpCodeProvider. Eso es lo que hago para Snippy, una pequeña herramienta para ayudar a ejecutar fragmentos de código fácilmente para C# en profundidad. El código fuente de Snippy es on the C# in Depth web site y puede darle una idea de lo que podría hacer; básicamente, solo desea que escriba el archivo ejecutable en un archivo en lugar de compilarlo en la memoria.

Como alternativa, consulte MSDN docs que tienen un ejemplo que genera un archivo ejecutable.

+0

@Downvoters: ¿importa dar una razón? –

+0

upvoted solo por el bien de ello. si miras la primera página, alguien está bajando la votación de todo lo que ve. – Femaref

+2

algo invalida todo. Mire la lista de preguntas. Muchas buenas preguntas son downvoted. Por favor, detén ese bot! –

11

Las clases que usted está buscando se encuentran en la Microsoft.CSharp espacio de nombres

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); 

(desde microsoft support encontrado mediante el uso de Google - toma menos de 20 segundos)

+3

¿le importa dar una razón para votar a la baja? – Femaref

+0

Las personas que rechazan las respuestas correctas me dan ganas de rechazar a los que votan negativamente. – Dykam

+0

No utilice texto condescendiente en la respuesta relacionada con Google. El objetivo de stackoverflow.com es no utilizar google y tener una referencia de codificación aquí. De lo contrario, ¿por qué no todos usamos Google? –

3

Tentativamente, también puede achive este throught que utilice de cosas en el espacio de nombres System.Reflection.Emit y creo que es posible proporcionar la implementación de un método mediante el uso de árboles de expresión LINQ. El cual es una especie de limpia:

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); 

al principio puede parecer un poco intimidante al principio, pero es cosas realmente buenas, y deja que el compilador genera la materia dura, la implementación del método. Pero realmente no puedes crear campos como este, eso requerirá algo de IL. Lo cual es muy divertido pero muy tedioso.

RENUNCIA:

No he probado a ejecutar el código de seguridad. Pero sé que va más o menos así, hace tiempo que no hago algo así.

0

La cosa más fácil de hacer sería crear (de antemano) un programa realmente corto que lea un recurso de sí mismo y lo imprima. Entonces su aplicación solo necesita colocar ese programa binario en algún lugar del disco y llamar a la función UpdateResource para cambiar la cadena. .NET también tiene soporte de recursos, pero no conozco ninguna función que corresponda directamente a UpdateResource.

Cuestiones relacionadas