我对在使用 Roslyn 执行 C# 脚本时如何添加引用感到有点困惑。
我使用的是通过 NuGet 安装的最新版本的 API (1.2.20906.2)。
我在 Google 上搜索了很多帖子,但自从我找到许多示例以来,API 发生了重大变化。
为了说明我要实现的目标:
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();
}
}
}
更新 - 包括在答案中建议的修改,以及通过 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();
}
}
}
最佳答案
它对我有用,尽管我使用的是 v1.2.20906.1。我没有尝试您的代码,我只是执行了一个月前为 Roslyn 演示文稿编写的版本。
尝试添加System.Core:
session.AddReference("System.Core");
这是迄今为止我能看到的唯一显着差异。
更新:我刚刚尝试了您的代码,但我上面提到的缺少引用确实是罪魁祸首。你甚至会得到很好的异常(exception):
(5,51): error CS1061: 'int[]' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'int[]' could be found (are you missing a using directive or an assembly reference?)
关于c# - 如何使用最新的 Roslyn API 添加引用(C# 脚本执行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20097326/