2013-11-20 5 views
5

का उपयोग करके संदर्भ कैसे जोड़ूं मैं सी # स्क्रिप्ट निष्पादित करने के लिए Roslyn का उपयोग करते समय संदर्भ जोड़ने के बारे में थोड़ा उलझन में हूं।मैं नवीनतम Roslyn API (सी # स्क्रिप्ट निष्पादन)

मैं एपीजी के नवीनतम संस्करण (1.2.20906.2) का उपयोग कर रहा हूं, जो NuGet के माध्यम से स्थापित है।

मैंने Google पर कई पोस्ट की खोज की है, लेकिन एपीआई में महत्वपूर्ण बदलाव आया है क्योंकि मैंने पाया है कि कई उदाहरण हैं। शामिल संशोधन जवाब में सुझाव दिया, प्लस 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.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(); 
     } 
    } 
} 

अद्यतन:

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 का उपयोग कर रहा हूँ। मैंने आपके कोड का प्रयास नहीं किया, मैंने सिर्फ एक महीने पहले रोज़लिन प्रस्तुति के लिए लिखा संस्करण को निष्पादित किया।

System.Core जोड़ने के लिए प्रयास करें:

session.AddReference("System.Core"); 

यही मुख्य अंतर केवल मैं अब तक देख सकता है।

अद्यतन: मैंने अभी आपके कोड की कोशिश की है और ऊपर उल्लेखित संदर्भ मैं वास्तव में अपराधी था।

(5,51): तुम भी अच्छा अपवाद त्रुटि CS1061: 'int []' एक परिभाषा के लिए 'कहाँ' शामिल नहीं है और कोई विस्तार विधि 'कहाँ' प्रकार का एक पहला तर्क को स्वीकार 'int []' पाया जा सकता है (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?)

+0

उत्कृष्ट, यही आवश्यक था। सिस्टम प्रकट होता है। .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

खुशी मैंने मदद की:) मैं एक ही मुद्दे से निपट रहा था। उम्मीद है कि एमएस रिलीज के करीब आता है, हमें अधिक अद्यतित दस्तावेज़ और नमूने मिलते हैं! –

+0

मैं जो एपीआई के इस नवीनतम संस्करण में देख रहा हूं, मैं पुराने दस्तावेज की तुलना में उपयोग करने के लिए बहुत आसान दिखता हूं। मैं सोच रहा हूं कि स्क्रिप्ट को स्वचालित रूप से आवश्यक संदर्भों के लिए पार्स किया गया है या नहीं। मुझे लगता है कि यह कुछ प्रकार के रेगेक्स पार्सर में निर्माण करने के लिए बहुत अधिक खिंचाव नहीं है, हालांकि रोज़लिन यहां क्या कर रहा है इसके खिलाफ यह प्रकार चलता है! – gb2d

संबंधित मुद्दे