在使用Roslyn执行C#脚本时,我对如何添加引用感到有点困惑。
我正在使用通过NuGet安装的最新版本的API(1.2.20906.2)。
我在谷歌上搜索过很多帖子,但是我发现的许多例子都有很大的变化。
说明我想要实现的目标:
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();
}
}
}
答案 0 :(得分:4)
虽然我使用的是v1.2.20906.1,但它对我有用。我没有尝试你的代码,我刚刚执行了我在一个月前为Roslyn演示文稿编写的版本。
尝试添加System.Core:
session.AddReference("System.Core");
这是迄今为止我能看到的唯一重大差异。
更新:我刚试过你的代码,上面提到的缺少参考确实是罪魁祸首。你甚至可以得到很好的例外:
(5,51):错误CS1061:'int []'不包含定义 '哪里'和没有扩展方法'哪里'接受第一个参数 可以找到类型'int []'(您是否缺少using指令或 装配参考?)