2013-11-20 214 views
5

我對使用Roslyn執行C#腳本時如何添加引用有點困惑。如何使用最新的Roslyn API(C#腳本執行)添加引用

我正在使用通過NuGet安裝的最新版本的API(1.2.20906.2)。

我在Google上搜索了很多帖子,但是由於我發現了許多示例,API有顯着的變化。

爲了說明我想要實現:

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

UPDATE - 修改包括在回答表明,加上路徑引用到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(); 
     } 
    } 
} 

回答

3

這是爲我工作,儘管我使用v1.2.20906.1。我沒有嘗試你的代碼,我剛剛執行了一個月前爲Roslyn演示文稿寫的版本。

嘗試添加System.Core程序:

session.AddReference("System.Core"); 

這是唯一的顯著差異我至今看到的。

更新:我剛剛試過你的代碼和我上面提到的缺少的參考確實是罪魁禍首。您還可以得到很好的例外:

(5,51):錯誤CS1061:「INT []」不包含定義 「在哪裏」,沒有擴展方法「去哪兒」接受 類型的第一個參數'int []'可以找到(你是否缺少使用指令或 程序集參考?)

+0

非常好,這就是我們所需要的。出現System.Core是在針對.NET Framework v 3.5時自動引用的。來源:http://blogs.msdn.com/b/pedram/archive/2007/11/07/system-core-dll-of-net-framework-3-5.aspx?Redirected=true – gb2d

+0

很高興我幫助: )我正在處理相同的問題。希望隨着MS越來越接近發佈,我們獲得更多最新的文檔和樣本! –

+0

與我以前看過的較舊的文檔相比,我在這個最新版本的API中看到的看起來要簡單得多。我想知道是否有一種方法可以自動解析腳本以獲取所需的引用。我想在某種正則表達式解析器中構建起來並不算什麼,儘管這種方式與Roslyn在這裏做的事情背道而馳! – gb2d