• 在.NET中嵌入IronPython 交互


    随着IronPyhon 2.0 的发布,.NET Dynamic Language Runtime 也更加成熟了,在2.0中我们可以用动态脚本以粘合剂的方式编写架构体系中的各种逻辑单元,既便于修改,又能灵活适合多变的业务场景。当然,我的目标是在 Platform Framework 中能嵌入脚本引擎,而不是用 ipy.exe 去执行一个 "独立" 的任务。要让.net 项目能真正跟脚本进行交互,还得需要提供脚本引擎的实现。这得提到DLR一些基本 概念了。

    下图摘自 DLR 帮助文件,通过它我们基本可以了解基于 DLR 的组成方式。

    uploads/200812/18_155159_1.png

    下图描述了 DLR 的基本执行流程。

    uploads/200812/18_155213_2.png

    • 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
      Code
      输出: 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. 对象实例共享
      Code
      载入程序集并由ScriptRuntime管理
    5. 创建程序集test.dll

      namespace My.Library
      {
        
      public class MyClass
        {
          
      public int Test(int x)
          {
            
      return ++x;
          }
        }

      创建Host程序

      Code

      读取Python上下文对象实例属性

      Code

      读取Python上下文对象实例方法
      engine.Execute("o.inc()", scope); //已经在上下文环境中执行此对象方法

  • 相关阅读:
    Android中的AsyncTask异步任务的简单实例
    Cubieboard学习资源
    BZOJ4518: [Sdoi2016]征途(dp+斜率优化)
    BZOJ1096: [ZJOI2007]仓库建设(dp+斜率优化)
    BZOJ1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
    BZOJ4517: [Sdoi2016]排列计数(组合数+错位排列)
    BZOJ4810: [Ynoi2017]由乃的玉米田(莫队+bitset)
    bitset用法小结
    BZOJ3687: 简单题(dp+bitset)
    BZOJ4484: [Jsoi2015]最小表示(拓扑排序乱搞+bitset)
  • 原文地址:https://www.cnblogs.com/ysisl/p/1594504.html
Copyright © 2020-2023  润新知