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

标签 c# roslyn

我对在使用 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/

相关文章:

c# - 在模块窗口中,我可以看到加载的 dll 以相同的路径出现两次

asp.net - 在 IIS 应用程序中禁用 roslyn

c# - 我在 C# OpenAI 库中收到 HttpClient.Timeout 错误

c# - params 过载明显的歧义 - 仍然可以编译和工作吗?

c# - 为什么这个方法调用不明确?

C# Roslyn 改变注释类型

.net - 如何使用 Roslyn SDK 编译 .NET 解决方案

c# - 如何使用我的项目部署数据库?

c# - 如何从帮助器类更新 WPF 绑定(bind)

c# - ASP.NET ConfirmButtonExtender 在 IE 中没有背景