2016-07-28 19 views
5

मैं एक परियोजना पर OSX netcoreapp1.0 को निशाना बनाने पर काम कर रहा हूँ, और मैं एक स्क्रिप्ट इस तरह रोसलिन का उपयोग कर सेट कर रहा हूं:.NET कोर पर Roslyn Scripting API: क्यों संकलक शिकायत करता है "त्रुटि CS1501: WriteLine के लिए कोई ओवरलोड 2 तर्क नहीं लेता है"?

var scriptText = File.ReadAllText(args[0]); 

var scriptOptions = ScriptOptions.Default 
    .WithReferences(
     typeof(System.Object).GetTypeInfo().Assembly 
    ); 

var script = CSharpScript.Create(scriptText, scriptOptions, typeof(Globals)); 

var scriptArgs = new string[args.Length-1]; 
Array.Copy(args, 1, scriptArgs, 0, args.Length-1); 

script.RunAsync(new Globals 
{ 
    Args = scriptArgs 
}) 
.GetAwaiter().GetResult(); 

कहाँ Globals है:

public class Globals 
{ 
    public string[] Args { get; set; } 
} 

जब मैं चलाने का प्रयास एक स्क्रिप्ट है कि इस तरह दिखता है:

using System; 

Console.WriteLine("Args[0]: {0}", Args[0]); 

कार्यक्रम इस अपवाद के साथ समाप्त हो जाता है:

$ dotnet run test.csx 
Project BitThicket.DotNet.ScriptTool (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation. 
Script error: Microsoft.CodeAnalysis.Scripting.CompilationErrorException: (7,9): error CS1501: No overload for method 'WriteLine' takes 2 arguments 
    at Microsoft.CodeAnalysis.Scripting.ScriptBuilder.ThrowIfAnyCompilationErrors(DiagnosticBag diagnostics, DiagnosticFormatter formatter) 
    at Microsoft.CodeAnalysis.Scripting.ScriptBuilder.CreateExecutor[T](ScriptCompiler compiler, Compilation compilation, CancellationToken cancellationToken) 
    at Microsoft.CodeAnalysis.Scripting.Script`1.GetExecutor(CancellationToken cancellationToken) 
    at Microsoft.CodeAnalysis.Scripting.Script`1.RunAsync(Object globals, Func`2 catchException, CancellationToken cancellationToken) 
    at BitThicket.DotNet.ScriptTool.Program.Main(String[] args) in /Users/ben/proj/bt/dotnet-scriptcs/src/BitThicket.DotNet.ScriptTool/Program.cs:line 63 

जाहिर है, Console वास्तव में, एक अधिभार है जो 2 विधियों को लेता है। मैंने CoreFx sources को संक्षेप में देखा कि क्या कोई अजीब प्रकार-अग्रेषण या एक्सटेंशन विधि चाल चल रही है, जिसे स्क्रिप्ट सेटअप में अतिरिक्त देखभाल की आवश्यकता हो सकती है, लेकिन मुझे वहां कुछ असामान्य दिखाई नहीं दे रहा था (शायद मुझे कुछ याद आया)।

रोज़लिन ScriptBuilder क्यों इस बारे में शिकायत करेगा?

+0

जब आप नई स्वरूपण शैली का उपयोग करते हैं तो क्या होता है? यानी 'कंसोल। राइटलाइन ($ "Args [0]: {Args [0]}"); ' – PhillipXT

+0

सुझाव के लिए धन्यवाद, @PhillipXT। यह स्ट्रिंग इंटरपोलेशन सिंटैक्स के साथ काम करता है, लेकिन यह अंतर्निहित मुद्दे पर पपरिंग है - स्क्रिप्ट वास्तव में केवल 'कंसोल। राइटलाइन' से अधिक है, लेकिन मैं असेंबली संदर्भों के साथ कई त्रुटियों में भाग ले रहा हूं। उम्मीद है कि यहां असली समस्या का पता लगाने से अन्य समस्याओं के लिए रास्ता भी प्रकाश में मदद मिलेगी। –

+1

बस जांचना और सुनिश्चित करना चाहता था कि Args [0] किसी भी तरह की समस्या नहीं थी। निश्चित नहीं है कि WriteLine के साथ और क्या गलत हो सकता है ... – PhillipXT

उत्तर

6

नेट कोर में, Console वर्ग System.Console विधानसभा में है, इसलिए आप इस स्क्रिप्ट का संदर्भ में जोड़ने के लिए की आवश्यकता होगी:

var scriptOptions = ScriptOptions.Default 
    .WithReferences(
     typeof(System.Object).GetTypeInfo().Assembly, 
     typeof(System.Console).GetTypeInfo().Assembly 
    ); 

आप Object की विधानसभा स्थान जाँच हैं, तो आप करेंगे इसे System.Private.CoreLib.ni.dll देखें। ILSpy का उपयोग करके, हम देख सकते हैं कि इस असेंबली में Write(string s), WriteLine(string s) और WriteLine() विधियों के साथ केवल मूल Console कार्यान्वयन शामिल है। जबकि System.Console असेंबली में पूर्ण कार्यान्वयन है।

+0

मदद कर सकता है मैं इस समय कोशिश करने के लिए अपने कंप्यूटर पर नहीं हूं, लेकिन अगर यह मामला है, तो मेरे उदाहरण में 'कंसोल' प्रकार को पूरी तरह से ढूंढने में संकलक विफल क्यों नहीं होगा? –

+0

@ बेनकॉलिन आप सही हैं, यह अजीब है। लेकिन असेंबली जोड़ना काम करता है, मैंने जांच की है। –

+1

@ बेनकॉलिन्स मैंने एक स्पष्टीकरण के साथ अपना जवाब अपडेट कर दिया है। –

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

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