2016-07-28 54 views
5

Ben OSX'te netcoreapp1.0 hedefleyen bir proje üzerinde çalışıyorum ve böyle Roslyn kullanarak bir komut dosyası kuruyorum:.NET'te Roslyn Komut Dosyası API'sı: derleyici neden "Hata CS1501: WriteLine için aşırı yüklenme 2 argüman almıyor" diye şikayet ediyor?

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 geçerli:

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

ben çalıştırmayı denediğinizde şöyle bir komut dosyası:

using System; 

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

programı bu durum ile sonlanır:

$ 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 

Açıkçası, Console, 2 yöntemi alan bir aşırı yüklenmeye sahip. Komut dosyası kurulumunda ek bir bakıma ihtiyaç duyabilecek tek tip iletme veya genişletme yöntemi numaralarının bulunup bulunmadığını görmek için CoreFx sources kısaca baktım, ama orada olağandışı bir şey görmedim (belki bir şey özledim).

Roslyn ScriptBuilder neden bu konuda şikayette bulunur? Eğer olacak, sen Object montajı konumunu kontrol edin

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

:

.NET Çekirdek yılında
+0

Yeni biçimlendirme stilini kullandığınızda ne olur? Console.WriteLine ($ "Args [0]: {Args [0]}"); – PhillipXT

+0

Öneriniz için teşekkürler @PhillipXT. Dize enterpolasyon sözdizimi ile çalışır, ancak temel sorun üzerinde bir tür kâğıtlama yapar - betik aslında sadece Console.WriteLine 'den daha fazlasını yapar, ama ben montaj referansları ile ilgili birtakım hatalara giriyorum. Umarım buradaki asıl meseleyi bulmak, diğer problemlerin de yolunu aydınlatmaya yardımcı olacaktır. –

+1

Sadece Args'ın [0] bir şekilde sorun olmadığını kontrol etmek ve kontrol etmek istedim. WriteLine ile başka hangi sorun olabilir emin değil ... – PhillipXT

cevap

6

, Console sınıf System.Console montaj, yani komut dosyasının başvuruları eklemek gerekir bunun System.Private.CoreLib.ni.dll olduğunu gör. ILSpy'yi kullanarak, bu montajın yalnızca Write(string s), WriteLine(string s) ve yöntemleriyle temel bir Console uygulamasını içerdiğini görebiliriz. Oysa, System.Console derlemesi tam uygulamayı içerir.

+0

Şu anda bunu denemek için bilgisayarımda değilim Bu durumda, derleyici neden benim örneğimde 'Konsol 'türünü bulma konusunda başarısız olmaz? –

+0

@BenCollins Haklısınız, garip. Ama meclisin eklenmesi işe yaradı, ben kontrol ettim. –

+1

@BenCollins Cevabımı bir açıklama ile güncelledim. –