zoukankan      html  css  js  c++  java
  • 在.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); //已经在上下文环境中执行此对象方法

  • 相关阅读:
    noip模拟赛 集合
    noip模拟赛 旅行
    noip模拟赛 终末
    noip模拟赛 少女
    noip模拟赛 无题
    Java基础知识强化73:正则表达式之分割功能
    Java基础知识强化72:正则表达式之判断功能(手机号码判断 和 校验邮箱)
    Java基础知识强化71:正则表达式之基本规则 和 常用正则表达式
    Java基础知识强化70:正则表达式之引入案例(QQ号码校验)
    Java基础知识强化69:基本类型包装类之Character案例(统计字符串中大写小写以及数字的次数)
  • 原文地址:https://www.cnblogs.com/ysisl/p/1594504.html
Copyright © 2011-2022 走看看