Jestem trochę zdezorientowany, jak dodać odniesienia podczas korzystania z Roslyn do wykonywania skryptów C#.Jak dodać odniesienia przy użyciu najnowszego interfejsu API Roslyn (wykonywanie skryptów C#)
Używam najnowszej wersji API (1.2.20906.2), instalowanej przez NuGet.
Szukałem wielu postów w Google, ale jest znacząca zmiana w API, ponieważ wiele przykładów znalazłem.
Aby zilustrować to, co usiłuję osiągnąć:
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();
}
}
}
AKTUALIZACJA - wliczony modyfikacja sugeruje odpowiedź, plus przedstawieniu przez ścieżkę do pliku 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.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();
}
}
}
Doskonałe, że to, co było potrzebne. Pojawia się SystemCore jest automatycznie przywoływany podczas kierowania na platformę .NET framework v 3.5. Źródło: http://blogs.msdn.com/b/pedram/archive/2007/11/07/system-core-dll-of-net-framework-3-5.aspx?Redirected=true – gb2d
Cieszę się, że pomogłem:) Miałem do czynienia z tymi samymi problemami. Mam nadzieję, że wraz ze zbliżaniem się MS dostaniemy bardziej aktualne dokumenty i próbki! –
To, co widzę w tej najnowszej wersji interfejsu API, wygląda o wiele łatwiej w użyciu w porównaniu ze starszą dokumentacją, na którą patrzyłem. Zastanawiam się, czy istnieje sposób automatycznego przeanalizowania skryptu pod kątem wymaganych referencji. Wydaje mi się, że nie ma sensu budować jakiegoś parsera Regex, choć ten rodzaj jest sprzeczny z tym, co robi tutaj Roslyn! – gb2d