2009-09-01 14 views
8

Mi chiedevo solo se ci sono funzioni incorporate in C++ OR C# che consente di utilizzare il compilatore in fase di runtime? Come per esempio se voglio tradurre:Compilare una stringa semplice

!print "hello world"; 

in:

MessageBox.Show("hello world"); 

e quindi generare un file EXE che sarà quindi in grado di visualizzare il messaggio di cui sopra? Ho visto qualche esempio di progetto in giro per il web pochi anni fa, ma non lo trova più.

risposta

15

È possibile utilizzare C#. Dai un'occhiata a questo Sample Project dal CodeProject.

codice estratto

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

L'utente deve avere il compilatore C# installato? O viene con .NET? Secondo http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx, questa funzionalità è inclusa in System.dll. – XXXXX

+0

Viene fornito con .NET – Dario

5

In C++ non è possibile utilizzare il compilatore in fase di esecuzione, ma è possibile incorporare un interprete nel progetto, come CINT.

+0

hmmm interessante, lo sto verificando ora - grazie mille :) –

3

Puoi sempre farlo nel modo sporco, con il sistema() e chiamare il compilatore " gcc ... "o il tuo equivalente

1

suggerimento di Nick è buono, ma c'è un'alternativa che è probabilmente più semplice da implementare (ma potrebbe non essere adatto a tutti i progetti). Se si può presumere che il proprio utente abbia installato un compilatore, è possibile generare un file e quindi compilarlo usando il proprio compilatore.

1

.NET Framework fornisce alcune classi che consentono di accedere a compilatori e generatori di codice per C# e VB.NET, risultando in un assembly caricato in memoria o in un semplice file .exe. Vedi CSharpCodeProvider e this article.

In alternativa, si può semplicemente creare i file di origine e compilarli manualmente (riga di comando chiamate (system) al compilatore, makefile).

Per quanto riguarda la traduzione della vostra fonte: Dovrete usare meccanismi di parsing come le espressioni regolari qui, o usare uno strumento compilatore-compilatore come Coco/R, yacc ecc. (Si noti che in C++, boost::spirit può anche essere abbastanza utile)

1

In C# è possibile creare un albero "CodeDom" .NET e quindi compilarlo utilizzando il compilatore .NET. Questo ti dà pieno accesso alla maggior parte delle funzionalità di .NET.

Vedere lo spazio dei nomi "System.CodeDom" o MSDN help for CodeCompileUnit per i dettagli.

Problemi correlati