Информация об изменениях

Сообщение Re[5]: Ошибка Компиляция Scripting API от 05.09.2016 8:25

Изменено 05.09.2016 9:07 Serginio1

Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Sinix, Вы писали:


S>Кстати работает в .Net Core и Scripting API


S>
S>public static void TestRoslynScript()
S>        {
S>            object result = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync("1 + 2").Result;
S>            Console.WriteLine(result.ToString());
S>            Console.ReadLine();

S>        }
S>


Но более сложные не работают

 static  String ПолучитьСтрокуДелегата()
        {
            string returnStr = @"return (MatchEvaluator)((match) =>
            {
              string x = match.Value;
            // If the first char is lower case...
        if (char.IsLower(x[0]))
        {
            // Capitalize it.
            return char.ToUpper(x[0]) + x.Substring(1, x.Length - 1);
        }
        return x;

            });";

            return returnStr;

        }


        static MatchEvaluator ПолучитьДелегат()
        {
            return (MatchEvaluator)((match) =>
               {
                   string x = match.Value;
                   // If the first char is lower case...
                   if (char.IsLower(x[0]))
                   {
                       // Capitalize it.
                       return char.ToUpper(x[0]) + x.Substring(1, x.Length - 1);
                   }
                   return x;


               });
               }
        public static void ТестRegex()
        {
           
            //   textBoxEval.AppendText(((D)СоздатьДелегат())().ToString());
            string words = "надо заменить все первые буквы в словах на заглавные";
            string pattern = @"\w+";
            // MatchEvaluator evaluator = (MatchEvaluator)ПолучитьДелегат();
            var scr = Microsoft.CodeAnalysis.Scripting.ScriptOptions.Default
                .WithReferences(typeof(string).GetTypeInfo().Assembly)
                .WithReferences(typeof(System.Text.StringBuilder).GetTypeInfo().Assembly)
                .WithReferences(typeof(MatchEvaluator).GetTypeInfo().Assembly)
                .WithReferences(typeof(System.Runtime.CompilerServices.IStrongBox).GetTypeInfo().Assembly)
                .WithImports("System", "System.Text.RegularExpressions");

              var result = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync(ПолучитьСтрокуДелегата(), scr).Result;
              MatchEvaluator evaluator = (MatchEvaluator)result;
           // MatchEvaluator evaluator = ПолучитьДелегат();
             Console.WriteLine(Regex.Replace(words, pattern, evaluator));
        }



Выдает ошибку
{Microsoft.CodeAnalysis.Scripting.CompilationErrorException: error CS0234: The type or namespace name 'RegularExpressions' does not exist in the namespace 'System.Text' (are you missing an assembly reference?)
   at Microsoft.CodeAnalysis.Scripting.ScriptBuilder.ThrowIfAnyCompilationErrors(DiagnosticBag diagnostics, DiagnosticFormatter formatter)
   at Microsoft.CodeAnalysis.Scripting.ScriptBuilder.CreateExecutor[T](ScriptCompiler compiler, Compilation compilation, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Scripting.Script`1.GetExecutor(CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Scripting.Script`1.RunAsync(Object globals, Func`2 catchException, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.RunAsync[T](String code, ScriptOptions options, Object globals, Type globalsType, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync(String code, ScriptOptions options, Object globals, Type globalsType, CancellationToken cancellationToken)
   at TestCoreNetApp.TestScriptingApi.ТестRegex() in D:\NetStandart\TestCoreNetApp\src\TestCoreNetApp\TestScriptingApi.cs:line 93
   at TestCoreNetApp.Program.TestRoslynScript() in D:\NetStandart\TestCoreNetApp\src\TestCoreNetApp\Program.cs:line 113
   at TestCoreNetApp.Program.Main(String[] args) in D:\NetStandart\TestCoreNetApp\src\TestCoreNetApp\Program.cs:line 124}
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Sinix, Вы писали:


S>Кстати работает в .Net Core и Scripting API


S>
S>public static void TestRoslynScript()
S>        {
S>            object result = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync("1 + 2").Result;
S>            Console.WriteLine(result.ToString());
S>            Console.ReadLine();

S>        }
S>


Но более сложные не работают

 static  String ПолучитьСтрокуДелегата()
        {
            string returnStr = @"return (MatchEvaluator)((match) =>
            {
              string x = match.Value;
            // If the first char is lower case...
        if (char.IsLower(x[0]))
        {
            // Capitalize it.
            return char.ToUpper(x[0]) + x.Substring(1, x.Length - 1);
        }
        return x;

            });";

            return returnStr;

        }


        static MatchEvaluator ПолучитьДелегат()
        {
            return (MatchEvaluator)((match) =>
               {
                   string x = match.Value;
                   // If the first char is lower case...
                   if (char.IsLower(x[0]))
                   {
                       // Capitalize it.
                       return char.ToUpper(x[0]) + x.Substring(1, x.Length - 1);
                   }
                   return x;


               });
               }
        public static void ТестRegex()
        {
           
             string words = "надо заменить все первые буквы в словах на заглавные";
            string pattern = @"\w+";
            // MatchEvaluator evaluator = (MatchEvaluator)ПолучитьДелегат();
            
            var scr = Microsoft.CodeAnalysis.Scripting.ScriptOptions.Default;
            scr=scr.WithReferences(typeof(MulticastDelegate).GetTypeInfo().Assembly, typeof(System.Runtime.CompilerServices.IStrongBox).GetTypeInfo().Assembly, typeof(MatchEvaluator).GetTypeInfo().Assembly);

//            scr = scr.WithReferences(typeof(string).GetTypeInfo().Assembly);
            scr = scr.WithImports("System", "System.Text.RegularExpressions");

                   

              var result = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync(ПолучитьСтрокуДелегата(), scr).Result;
              MatchEvaluator evaluator = (MatchEvaluator)result;
           // MatchEvaluator evaluator = ПолучитьДелегат();
             Console.WriteLine(Regex.Replace(words, pattern, evaluator));        }



Выдает ошибку

Необработанное исключение типа "Microsoft.CodeAnalysis.Scripting.CompilationErrorException" в Microsoft.CodeAnalysis.Scripting.dll

Дополнительные сведения: (1,8): error CS0012: The type 'MulticastDelegate' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'


Хотя ссылка на typeof(MulticastDelegate).GetTypeInfo().Assembly и какой нафиг mscorlib в .Net Core