如何使用最新的Roslyn API添加引用(C#脚本执行)

时间:2013-11-20 13:30:42

标签: c# roslyn

在使用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();
        }
    }
}

1 个答案:

答案 0 :(得分:4)

虽然我使用的是v1.2.20906.1,但它对我有用。我没有尝试你的代码,我刚刚执行了我在一个月前为Roslyn演示文稿编写的版本。

尝试添加System.Core:

session.AddReference("System.Core");

这是迄今为止我能看到的唯一重大差异。

更新:我刚试过你的代码,上面提到的缺少参考确实是罪魁祸首。你甚至可以得到很好的例外:

  

(5,51):错误CS1061:'int []'不包含定义   '哪里'和没有扩展方法'哪里'接受第一个参数   可以找到类型'int []'(您是否缺少using指令或   装配参考?)