2014-05-13 3 views
5

Sto provando a giocare con l'anteprima dell'utente finale di roslyn e vorrei eseguire un semplice script. Quello che vorrei fare è qualcosa di simile:Come eseguire uno script con Roslyn in Anteprima utente finale

static void Main(string[] args) 
{ 
    // Is this even valid? 
    var myScript = "int x = 5; int y = 6; x + y;"; 

    // What should I do here? 
    var compiledScript = Something.Compile(myScript); 
    var result = compiledScript.Execute(myScript); 


    Console.WriteLine(result); 
} 

può puntare a qualcuno di alcune risorse e/o me che Nuget pacchetti dire installare per fare questo accadere. Ho installato Microsoft.CodeAnalysis, ma non riesco a capire se è fattibile con questo, mi sento come se mi mancasse qualcosa.

risposta

8

Le API di scripting che consentono di eseguire questa operazione molto facilmente sono state (temporaneamente) rimosse nell'ultima anteprima. È ancora possibile compilare uno script, emettere e caricare l'assembly e invocare il suo punto di ingresso facendo qualcosa sulla falsariga di

public static class Program 
{ 
    public static void Main(string[] args) 
    { 
     var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location); 

     var defaultReferences = new[] { "mscorlib.dll", "System.dll", "System.Core.dll" }; 

     var script = @"using System; 
     public static class Program 
     { 
      public static void Main(string[] args) 
      { 
       Console.WriteLine(""Hello {0}"", args[0]); 
      } 
     }"; 

     // Parse the script to a SyntaxTree 
     var syntaxTree = CSharpSyntaxTree.ParseText(script); 

     // Compile the SyntaxTree to a CSharpCompilation 
     var compilation = CSharpCompilation.Create("Script", 
      new[] { syntaxTree }, 
      defaultReferences.Select(x => new MetadataFileReference(Path.Combine(assemblyPath, x))), 
      new CSharpCompilationOptions(OutputKind.ConsoleApplication)); 

     using (var outputStream = new MemoryStream()) 
     using (var pdbStream = new MemoryStream()) 
     { 
      // Emit assembly to streams. 
      var result = compilation.Emit(outputStream, pdbStream: pdbStream); 
      if (!result.Success) 
      { 
       return; 
      } 

      // Load the emitted assembly. 
      var assembly = Assembly.Load(outputStream.ToArray(), pdbStream.ToArray()); 

      // Invoke the entry point. 
      assembly.EntryPoint.Invoke(null, new object[] { new[] { "Tomas" } }); 
     } 
    } 
} 

Sarà uscita Hello Tomas nella console :)

+1

Ho dovuto sostituire 'new MetadataFileReference' con' MetadataReference.CreateFromFile' in Roslyn versione 1.0.0-beta1 – Rawling

2

Sembra che nel aprile 2014 rilascio, scripting has been temporarily removed:

cosa è successo al REPL e di hosting API di scripting?

Il team sta esaminando i progetti di questi componenti che è stato visto in C2 precedenti , prima di reintrodurre nuovamente i componenti. Attualmente il team sta lavorando al completamento della semantica linguistica del codice interattivo/script .

+0

Grazie, ha segnato l'altra risposta dal momento che mi ha mostrato come fare almeno :) –