2015-12-22 6 views
3

Я пытаюсь интегрировать скрипты C# в свое приложение. Я использую объект globals, чтобы сделать доступными различные данные для моих скриптов.Доступ к глобальным переменным в скриптовом классе в CSharpScript

public class Globals 
{ 
    public int X; 
    public int Y; 
} 

Однако, кажется, что Глобалы доступны только на «глобальном» уровне сценария. Это работает:

Console.WriteLine(CSharpScript.EvaluateAsync<int>(
    "X + Y", 
    globals: new Globals { X = 1, Y = 2 }).Result); 

Когда я пытаюсь получить доступ к глобалам в сценарном классе я всегда в конечном итоге с исключением:

Console.WriteLine(CSharpScript.EvaluateAsync<int>(
    @"class Foo 
    { 
     public int Bar() 
     { 
      return X + Y; 
     } 
    } 

    var foo = new Foo(); 
    foo.Bar()", globals: new Globals { X = 1, Y = 2 }).Result); 

Microsoft.CodeAnalysis.Scripting.CompilationErrorException: (5 , 24): ошибка CS0120: требуется ссылка на объект для нестатического поля, метода или свойства «Globals.Y»

Ожидается, что глобальные значения будут работать только на «глобальном» уровне скрипта? Из сообщения об исключении кажется, что двигатель правильно идентифицировал свойство Y, принадлежащее объекту Globals.

Я использую Microsoft.CodeAnalysis.CSharp.Scripting V1.1.1

ответ

2

This behavior is by design:

Глобальные переменные доступны только в операторах и методах верхнего уровня, а не в классы.

0

Вы должны использовать RunAsync, не EvaluateAsync и оценить массив переменных в ScriptState.

Task<ScriptState<object>> scrstate=CSharpScript.RunAsync(yourscript); 
var ret_global = scrstate.Result.Variables[0].Value; 

Глобалы будет 0,1,2 ...

RunAsync samples

+1

У меня нет проблем с доступом к глобалам после завершения скрипта. У меня проблема с доступом к глобальным переменным внутри самого скрипта. Сценарий может запускаться не через RunAsync или EvaluateAsync из-за исключения, упомянутого выше. – manison

Смежные вопросы