2013-11-20 11 views
5

C# komut dosyalarını yürütmek için Roslyn'i kullanırken başvurular eklemeyle ilgili nasıl gideceğimiz konusunda biraz kafam karıştı.En son Roslyn API'sini (C# Komut Dosyası Yürütme) kullanarak başvuruları nasıl eklerim

NuGet aracılığıyla yüklenen API'nın en son sürümünü (1.2.20906.2) kullanıyorum.

Google'da pek çok yayında arama yaptım, ancak buldukları örneklerin çoğundan dolayı API'da önemli bir değişiklik var. Dahil modifikasyon cevap önerdi artı DLL yolunda tarafından referans -

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(); 
     } 
    } 
} 

GÜNCELLEME: Bu benim için çalışıyor

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(); 
     } 
    } 
} 

cevap

3

elde etmek çalışıyorum göstermek için , v1.2.20906.1 kullanıyorum. Kodunu denemedim, bir ay önce Roslyn sunumuna yazdığım versiyonu çalıştırdım.

System.Core eklemeyi deneyin: Şimdiye kadar görebilirsiniz tek önemli fark

session.AddReference("System.Core"); 

.

Güncelleme: Sadece kodunuzu denedim ve yukarıda bahsettiğim eksik referans gerçekten suçluydu. 'Int []' 'Nerede' için bir tanım içermiyor ve hiçbir uzantı yöntemi 'Nerede' tip bir ilk argüman kabul: hata CS1061:

(5,51): Hatta güzel istisna olsun 'int []' bulunamadı (bir yönerge veya derleme başvurusu eksik misiniz?)

+0

Mükemmel, gerekli olan bu. .NET framework v 3.5 hedeflenirken System.Core otomatik olarak başvuruda bulunur. Kaynak: http://blogs.msdn.com/b/pedram/archive/2007/11/07/system-core-dll-of-net-framework-3-5.aspx?Redirected=true – gb2d

+0

Yardım ettim:) Aynı sorunlarla uğraşıyordum. Umarım MS daha yakınlaştıkça daha güncel belgeler ve örnekler alırız! –

+0

API'nın bu son sürümünde gördüğüm şey, baktığım eski belgelerle karşılaştırıldığında çok daha basit görünüyor. Komut dosyasının gerekli referanslar için otomatik olarak ayrıştırılmasının bir yolu olup olmadığını merak ediyorum. Sanırım bir çeşit Regex ayrıştırıcısını inşa etmek için bir gerginlik değil, ama bu Roslyn'in burada yaptıklarına karşı çıkıyor! – gb2d