2009-09-01 8 views
8

¿Estaba preguntándome si hay funciones integradas en C++ O C# que le permitan usar el compilador en tiempo de ejecución? Como por ejemplo si quiero traducir:Compilar cadena simple

!print "hello world"; 

en:

MessageBox.Show("hello world"); 

y luego generar un exe que entonces será capaz de mostrar el mensaje anterior? Hace unos años, he visto proyectos de muestra en la web que hicieron esto pero ya no pueden encontrarlo.

Respuesta

15

Es posible usar C#. Eche un vistazo a este Sample Project del CodeProject.

Extracto Código

private Assembly BuildAssembly(string code) 
{ 
    Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider(); 
    ICodeCompiler compiler = provider.CreateCompiler(); 
    CompilerParameters compilerparams = new CompilerParameters(); 
    compilerparams.GenerateExecutable = false; 
    compilerparams.GenerateInMemory = true; 
    CompilerResults results = compiler.CompileAssemblyFromSource(compilerparams, code); 
    if (results.Errors.HasErrors) 
    { 
     StringBuilder errors = new StringBuilder("Compiler Errors :\r\n"); 
     foreach (CompilerError error in results.Errors) 
     { 
      errors.AppendFormat("Line {0},{1}\t: {2}\n", error.Line, error.Column, error.ErrorText); 
     } 
     throw new Exception(errors.ToString()); 
    } 
    else 
    { 
     return results.CompiledAssembly; 
    } 
} 

public object ExecuteCode(string code, string namespacename, string classname, string functionname, bool isstatic, params object[] args) 
{ 
    object returnval = null; 
    Assembly asm = BuildAssembly(code); 
    object instance = null; 
    Type type = null; 
    if (isstatic) 
    { 
     type = asm.GetType(namespacename + "." + classname); 
    } 
    else 
    { 
     instance = asm.CreateInstance(namespacename + "." + classname); 
     type = instance.GetType(); 
    } 
    MethodInfo method = type.GetMethod(functionname); 
    returnval = method.Invoke(instance, args); 
    return returnval; 
} 
+0

¿El usuario debe tener instalado el compilador C#? ¿O eso viene con .NET? De acuerdo con http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx, esta funcionalidad se incluye en System.dll. – XXXXX

+0

Viene con .NET – Dario

5

En C++ no puede utilizar el compilador en tiempo de ejecución, pero puede incrustar un intérprete en su proyecto, como CINT.

+0

hmmm interesante, estoy comprobando eso ahora - muchas gracias :) –

3

Siempre se puede hacer de la manera sucia, con el sistema() y llamar al compilador " gcc ... "o su equivalente

1

sugerencia de Nick es bueno, pero hay una alternativa que es probablemente más fácil de implementar (pero podría no ser apropiada para todos los proyectos). Si puede suponer que su usuario tiene un compilador instalado, puede generar un archivo y luego compilarlo utilizando su compilador.

1

.NET-framework proporciona algunas clases que le dan acceso a compiladores y generadores de código para C# y VB.NET, lo que resulta en un ensamblaje cargado en la memoria o en un simple archivo .exe. Ver CSharpCodeProvider y this article.

alternativa, puede simplemente crear los archivos de origen y compilarlos manualmente (línea de comandos llamadas (system) para el compilador, archivos make).

En cuanto a la traducción de su fuente: tendrá que usar mecanismos de análisis como expresiones regulares aquí, o usar una herramienta compilador compilador como Coco/R, yacc etc. (Tenga en cuenta que bajo C++, boost::spirit también puede ser bastante útil)

1

En C# puede crear un árbol .NET "CodeDom" y luego compilarlo usando el compilador .NET. Esto le da acceso completo a la mayoría de las características de .NET.

Consulte el espacio de nombres "System.CodeDom" o el MSDN help for CodeCompileUnit para obtener más información.

Cuestiones relacionadas