C# komut dosyalarını yürütmek için Roslyn'i kullanırken başvurular eklemeyle ilgili nasıl gideceğimiz konusunda biraz kafam karıştı.En son Roslyn API'sini (C# Komut Dosyası Yürütme) kullanarak başvuruları nasıl eklerim
NuGet aracılığıyla yüklenen API'nın en son sürümünü (1.2.20906.2) kullanıyorum.
Google'da pek çok yayında arama yaptım, ancak buldukları örneklerin çoğundan dolayı API'da önemli bir değişiklik var. Dahil modifikasyon cevap önerdi artı DLL yolunda tarafından referans -
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();
}
}
}
GÜNCELLEME: Bu benim için çalışıyor
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();
}
}
}
Mükemmel, gerekli olan bu. .NET framework v 3.5 hedeflenirken System.Core otomatik olarak başvuruda bulunur. Kaynak: http://blogs.msdn.com/b/pedram/archive/2007/11/07/system-core-dll-of-net-framework-3-5.aspx?Redirected=true – gb2d
Yardım ettim:) Aynı sorunlarla uğraşıyordum. Umarım MS daha yakınlaştıkça daha güncel belgeler ve örnekler alırız! –
API'nın bu son sürümünde gördüğüm şey, baktığım eski belgelerle karşılaştırıldığında çok daha basit görünüyor. Komut dosyasının gerekli referanslar için otomatik olarak ayrıştırılmasının bir yolu olup olmadığını merak ediyorum. Sanırım bir çeşit Regex ayrıştırıcısını inşa etmek için bir gerginlik değil, ama bu Roslyn'in burada yaptıklarına karşı çıkıyor! – gb2d