0

以前、Mono コンパイラをサービスとして使用するプログラムを作成しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mono.CSharp;

namespace MonoTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Initializing the evaluator
            Evaluator.Init(new string[0]);           

            //Importing namespaces 
            Evaluator.Run("using System;");
            Evaluator.Run("using System.Linq;");
            Evaluator.Run("using System.Collections.Generic;");

            //Sum of 'n' numbers
            Evaluator.Run("List<int> numbers= new List<int> {1,2,3,4,5,6,7,8,9,10} ;");
            Evaluator.Run("var sum = numbers.Sum();");
            Evaluator.Run("Console.WriteLine(sum);");
        }
    }
}

//出力

55

Roslynを使用して同じことをしようとしています(私の最初のコード)[Roslyn Project Type:console Application]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Roslyn.Scripting;
using Roslyn.Scripting.CSharp;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new ScriptingHost();
            string codeLine = string.Empty;
            codeLine += "List<int> numbers= new List<int> {1,2,3,4,5,6,7,8,9,10} ;" + Environment.NewLine;
            codeLine += "var sum = numbers.Sum();";
            codeLine += "Console.WriteLine(sum);";

            var res = host.Execute(codeLine);

            //Write the result back to console
            if (res != null)
                Console.WriteLine(" = " + res.ToString());

            Console.ReadKey();

        }
    }

    public class ScriptingHost
    {
        private ScriptEngine engine;
        private Session session;       

        public ScriptingHost()
        {
            //Create a session
            session = Session.Create(this);

            //Create the engine, just pass the assemblies and namespaces
            engine = new ScriptEngine(new Assembly[]
                                {
                                    typeof(Console).Assembly,
                                    typeof(ScriptingHost).Assembly,
                                    typeof(IEnumerable<>).Assembly,
                                    typeof(IQueryable).Assembly
                                },
                                new string[] 
                                { 
                                    "System", "System.Linq", 
                                    "System.Collections",
                                    "System.Collections.Generic"
                                }
                            );

        }

        //Pass the code to the engine, nothing much here
        public object Execute(string code)
        {
            return engine.Execute(code, session); --Error at this line
        }
    }
}

しかし、このエラーが発生する

"(1,34): エラー CS8000: この言語機能 ('初期化子を使用したオブジェクト作成式') は、Roslyn ではまだ実装されていません。"

助けてください

4

1 に答える 1

4

リストの作成とリストの作成を分離する必要があるようです。

codeLine += "List<int> numbers= new List<int>();";
codeLine += "var values = new int[] {1,2,3,4,5,6,7,8,9,10};";
codeLine += "numbers.AddRange(values);";

編集: または、コメントで @svick によって提案されているように、リストを取るコンストラクターのオーバーロードを使用します。

codeLine += "var numbers = new List<int>(new int[] {1,2,3,4,5,6,7,8,9,10});";
于 2012-06-19T12:56:13.827 に答える