2013-04-20 15 views
7

Ho sviluppato un'applicazione che utilizza file di script C# per determinate configurazioni e impostazioni. Il file di script contiene vari oggetti generati dall'utente e determinate funzioni su quegli oggetti. Attualmente, l'utente deve generare un file .cs utilizzando un editor di terze parti e fornire il percorso al mio programma per farne uso. Lo svantaggio di questo metodo è che l'utente non ha la flessibilità del completamento automatico e del supporto intellisense durante la modifica dei file di script.Utilizzo di C# come linguaggio di scripting per un'applicazione C#

Desidero incorporare la parte di modifica degli script nella mia applicazione. Posso farlo usando un editor RTF. Ma codificare la parte auto-completa è un enorme dolore. C'è un modo in cui posso fornire all'utente un editor in-programma che esegue anche il completamento automatico ....

Codice per compilare uno script in modo dinamico in un programma.

public String Compile(String inputfilepath) 
    { 

     CompilerResults res = null; 
     CSharpCodeProvider provider = new CSharpCodeProvider(); 
     String errors = ""; 

     if (provider != null) 
     { 
      try 
      { 
       Assembly asb = Assembly.Load("BHEL.PUMPSDAS.Datatypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=81d3de1e03a5907d"); 
       CompilerParameters options = new CompilerParameters(); 
       options.GenerateExecutable = false; 
       options.OutputAssembly = String.Format(outFileDir + oName); 
       options.GenerateInMemory = false; 
       options.TreatWarningsAsErrors = false; 
       options.ReferencedAssemblies.Add("System.dll"); 
       options.ReferencedAssemblies.Add("System.Core.dll"); 
       options.ReferencedAssemblies.Add("System.Xml.dll"); 
       options.ReferencedAssemblies.Add("System.Xml.dll"); 
       options.ReferencedAssemblies.Add(asb.Location); 
       res = provider.CompileAssemblyFromFile(options, inputfilepath); 
       errors = ""; 
       if (res.Errors.HasErrors) 
       { 
        for (int i = 0; i < res.Errors.Count; i++) 
        { 
         errors += "\n " + i + ". " + res.Errors[i].ErrorText; 
        } 
       } 
      } 

      catch (Exception e) 
      { 
       throw (new Exception("Compilation Failed with Exception!\n" + e.Message + 
        "\n Compilation errors : \n" + errors + "\n")); 
      } 

     } 
     return errors; 
    } 
+0

Lua, Python o powerscript? Quale linguaggio di script stai usando? – David

+1

C# stesso è il mio linguaggio di scripting. Sto usando lo spazio dei nomi CodeDom per compilare i file di script C# al volo dal mio programma. –

+0

oh mio dio! C# è il tuo script? Sei sicuro? – David

risposta

2

In particolare per il completamento automatico, è necessario utilizzare due sistemi: un parser e una riflessione.

Un parser è un concetto piuttosto semplice, in teoria, ma sono sicuro che non sarà facile scrivere per una lingua con tanto zucchero sintattico e tante parole chiave sensibili al contesto come C#.

Poiché .NET è intrinsecamente riflettente e fornisce un quadro di riflessione, anche questa parte non dovrebbe essere incredibilmente dolorosa. Reflection consente di manipolare gli oggetti orientati agli oggetti che comprendono gli assembly compilati - e gli assembly stessi - come oggetti. Un metodo sarebbe un oggetto Method, ad esempio. Puoi dare un'occhiata a questo sistema esaminando i membri della classe Type, che forniscono un punto di partenza di base per la riflessione. Un altro utile punto di partenza è Assembly. MSDN, come al solito, ha una ricchezza di informazioni "ufficiali" in un formato strutturato.

+0

Il tuo metodo funziona su sistemi già compilati. Quello che voglio è lo stile di studio visivo Intellisense, che funziona anche prima che il codice sia compilato. –

+0

Il che significa essenzialmente che lo stai compilando mentre procedi. Stessa idea Puoi ancora usare la riflessione; il quadro è a posto. Stai praticamente compilando una shell orientata agli oggetti. Dovrai fare qualcosa di personalizzato per le variabili locali, ma questo è solo un elemento. – Zenexer

Problemi correlati