2013-11-20 11 views
5

Jestem trochę zdezorientowany, jak dodać odniesienia podczas korzystania z Roslyn do wykonywania skryptów C#.Jak dodać odniesienia przy użyciu najnowszego interfejsu API Roslyn (wykonywanie skryptów C#)

Używam najnowszej wersji API (1.2.20906.2), instalowanej przez NuGet.

Szukałem wielu postów w Google, ale jest znacząca zmiana w API, ponieważ wiele przykładów znalazłem.

Aby zilustrować to, co usiłuję osiągnąć:

using System; 
using Roslyn.Scripting.CSharp; 

namespace Test.ConsoleApp 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      new ScriptRunner().RunScripts(); 
     } 
    } 

    public class ScriptRunner 
    { 
     public void RunScripts() 
     { 
      var engine = new ScriptEngine(); 

      var session = engine.CreateSession(); 

      session.AddReference("System"); 
      session.AddReference("System.Linq"); 

      // The following script runs successfully 

      session.Execute(@"using System; 

           var arr = new[] {1, 2, 6}; 

           foreach (var i in arr) 
           { 
            if(i > 1) 
            { 
            Console.WriteLine(i); 
            } 
           }" 
          ); 

      // The following script using Linq fails 

      session.Execute(@"using System; 
           using System.Linq; 

           var arr = new[] {1, 2, 6}; 
           var arrResult = arr.Where(x => x > 1); 

           foreach (var i in arrResult) 
           { 
            Console.WriteLine(i); 
           }" 
          ); 

      Console.ReadLine(); 
     } 
    } 
} 

AKTUALIZACJA - wliczony modyfikacja sugeruje odpowiedź, plus przedstawieniu przez ścieżkę do pliku DLL:

using System; 
using Roslyn.Scripting.CSharp; 

namespace Test.ConsoleApp 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      new ScriptRunner().RunScripts(); 
     } 
    } 

    public class ScriptRunner 
    { 
     public void RunScripts() 
     { 
      var engine = new ScriptEngine(); 

      var session = engine.CreateSession(); 

      session.AddReference("System"); 
      session.AddReference("System.Core"); // This reference is required to use Linq language features 
      session.AddReference("System.Linq"); 

      session.Execute(@"using System; 
           using System.Linq; 

           var arr = new[] {1, 2, 6}; 
           var arrResult = arr.Where(x => x > 1); 

           foreach (var i in arrResult) 
           { 
            Console.WriteLine(i); 
           }" 
          ); 

      // Example use of adding reference to external project by path to dll 

      session.AddReference(@"E:\SVN\CSharpRoslynTesting\CSharpRoslynTesting\Test.ExternalLibraryTest\bin\Debug\Test.ExternalLibraryTest.dll"); 

      session.Execute(@"using System; 
           using Test.ExternalLibraryTest; 

           var externalTestClass = new ExternalTestClass(); 
           externalTestClass.TestOutput(); 
          " 
          ); 

      Console.ReadLine(); 
     } 
    } 
} 

Odpowiedz

3

to działa dla mnie , chociaż używam v1.2.20906.1. Nie próbowałem twojego kodu, właśnie wykonałem wersję, którą napisałem do prezentacji Roslyn miesiąc wcześniej.

Spróbuj dodać System.Core:

session.AddReference("System.Core"); 

to jedyna istotna różnica widzę tak daleko.

Aktualizacja: Właśnie wypróbowałem twój kod i brakujące odniesienie, o którym wspomniałem powyżej, było rzeczywiście winowajcą. Można nawet dostać miły wyjątek:

(5,51): error CS1061: „int []” nie zawierają definicji dla „Gdzie” i nie metoda rozszerzenie "Gdzie przyjęcie pierwszego argumentu typu „int []” można odnaleźć (czy brakuje using dyrektywa lub odwołania zestawu?)

+0

Doskonałe, że to, co było potrzebne. Pojawia się SystemCore jest automatycznie przywoływany podczas kierowania na platformę .NET framework v 3.5. Źródło: http://blogs.msdn.com/b/pedram/archive/2007/11/07/system-core-dll-of-net-framework-3-5.aspx?Redirected=true – gb2d

+0

Cieszę się, że pomogłem:) Miałem do czynienia z tymi samymi problemami. Mam nadzieję, że wraz ze zbliżaniem się MS dostaniemy bardziej aktualne dokumenty i próbki! –

+0

To, co widzę w tej najnowszej wersji interfejsu API, wygląda o wiele łatwiej w użyciu w porównaniu ze starszą dokumentacją, na którą patrzyłem. Zastanawiam się, czy istnieje sposób automatycznego przeanalizowania skryptu pod kątem wymaganych referencji. Wydaje mi się, że nie ma sensu budować jakiegoś parsera Regex, choć ten rodzaj jest sprzeczny z tym, co robi tutaj Roslyn! – gb2d

Powiązane problemy