日期:2010-02-19 浏览次数:20655 次
要让.net 项目能真正跟脚本进行交互,还得需要提供脚本引擎的实现。这得提到DLR一些基本概念了。
下图摘自 DLR 帮助文件,通过它我们基本可以了解基于 DLR 的组成方式。
下图描述了 DLR 的基本执行流程。
ScriptRuntime: 创建 DLR 运行环境,这是整个执行过程的起始点,它表示一个全局的执行状态(比如程序集引用等等)。每个应用程序域(AppDomain)中可以启动多个 ScriptRuntime。
ScriptScope: 构建一个执行上下文,其中保存了环境及全局变量。宿主(Host)可以通过创建不同的 ScriptScope 来提供多个数据隔离的执行上下文。
ScriptEngine: DLR 动态语言(比如 IronPython) 执行类,可于解析和执行动态语言代码。
ScriptSource: 操控动态语言代码的类型,我们可以编译(Compile)、读取(Read Code Lines)或运行(Execute)代码。
CompiledCode: 调用 ScriptSource.Compile() 将源代码编译成 CompiledCode,这样多次执行就无需重复编译,从而提高执行性能。
ObjectOperations: 提供了相关方法,允许我们在宿主(Host)中操作 DLR 对象成员(Member)。
现在我们来构建脚本引擎
当然我们必须加入IronPyhton提供的相关引用并导入命名空间
using IronPython.Hosting;
using IronPython.Compiler;
using IronPython.Runtime;
using Microsoft.Scripting;
using System.Runtime.Remoting;
1、Hello World
以下为引用的内容: var py = @" def test(): return ‘hello world~!’; print test();"; var engine = Python.CreateEngine(); var code = engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements); code.Execute(); |
输出: hello world~!
注意:Python 对于源代码缩进的格式有严格要求。
2、给Python上下文提供变量
var scope = engine.Runtime.Globals; //engine.Runtime.CreateScope();
scope.SetVariable(“x”, 123);
3、读取Python上下文中的变量
var x = scope.GetVariable<int>(“x”);
可以看出 ScriptScope 可以在 Host 和 ScriptRuntime 间传递数据。
4、对象实例共享
以下为引用的内容: var py = @" o.X = o.X + 2; print o.X;"; var engine = Python.CreateEngine(); var code = engine.CreateSc
免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
|