Доброго, может ли кто привести пример доступа из скрипта к экземпляру класса, из которого выполняется сам скрипт. Нужно изменять в скрипте свойства экземпляра класса для настройки параметров. Хотелось бы что-нить без статических полей, если возможно. Может быть есть какой-то специальный механизм?
Вот так вызываю скрипт в виде строки:
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
private void RunScript( XYPlot xyplot ) {
ScriptEngine engine;
ScriptRuntime runtime;
ScriptSource source = null;
try {
XYPlot.xyplot = xyplot.canv;
engine = Python.CreateEngine();
runtime = engine.Runtime;
runtime.LoadAssembly( System.Reflection.Assembly.GetExecutingAssembly() );
source = engine.CreateScriptSourceFromString( base.canv.Script, SourceCodeKind.AutoDetect );
ScriptScope scope = runtime.CreateScope();
CompiledCode compil = source.Compile();
// Выполняем скрипт.
compil.Execute( scope );
} catch {}
}
XYPlot.xyplot = xyplot.canv; — это использование статического поля, которое будет доступно в скрипте. Делаю по аналогии со
статьёй на хабре, где использовалось статическое поле для доступа к экземпляру. Я не спец по python и IronPython и потому хотелось бы посмотреть на примеры использования скриптов для управления свойствами экземпляра класса.
Здравствуйте, uni, Вы писали:
uni>пример доступа из скрипта к экземпляру класса, из которого выполняется сам скрипт.
ScriptScope scope = runtime.CreateScope();
scope.SetVariable("ThisInstance", this)
compil.Execute( scope );
Об этом экземпляре речь?
Здравствуйте, Mihas, Вы писали:
M>Здравствуйте, uni, Вы писали:
uni>>пример доступа из скрипта к экземпляру класса, из которого выполняется сам скрипт.
M>M>ScriptScope scope = runtime.CreateScope();
M>scope.SetVariable("ThisInstance", this)
M>compil.Execute( scope );
M>
M>Об этом экземпляре речь?
Да, именно об этом. Надо же, не думал, что это так просто. Попробую, посмотрю что будет. Спасибо.
Здравствуйте, Mihas, Вы писали:
M>Здравствуйте, uni, Вы писали:
uni>>пример доступа из скрипта к экземпляру класса, из которого выполняется сам скрипт.
M>M>ScriptScope scope = runtime.CreateScope();
M>scope.SetVariable("ThisInstance", this)
M>compil.Execute( scope );
M>
M>Об этом экземпляре речь?
Работает хорошо, спасибо. Давно нужно было скрипт приделать, осталось теперь как-то поудобнее сборки дополнительные упаковать.