• 在.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 NDK开发及调用标准linux动态库.so文件
    android ndk增加对stl的支持
    Android中JNI的使用方法
    OCP-1Z0-052-V8.02-55题
    OCP-1Z0-053-V12.02-162题
    OCP-1Z0-052-V8.02-52题
    OCP-1Z0-052-V8.02-50题
    OCP-1Z0-052-V8.02-49题
    Android 中Java 和C/C++的相互调用方法
    用JNI调用C或C++动态联接库入门
  • 原文地址:https://www.cnblogs.com/ysisl/p/1594504.html
Copyright © 2020-2023  润新知