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
Yeni biçimlendirme stilini kullandığınızda ne olur? Console.WriteLine ($ "Args [0]: {Args [0]}"); – PhillipXT
Ö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. –
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