一起谈.NET技术,在.NET中嵌入IronPython 交互

简介:   随着IronPyhon 2.0 的发布,.NET Dynamic Language Runtime 也更加成熟了,在2.0中我们可以用动态脚本以粘合剂的方式编写架构体系中的各种逻辑单元,既便于修改,又能灵活适合多变的业务场景。

  随着IronPyhon 2.0 的发布,.NET Dynamic Language Runtime 也更加成熟了,在2.0中我们可以用动态脚本以粘合剂的方式编写架构体系中的各种逻辑单元,既便于修改,又能灵活适合多变的业务场景。当然,我的目标是在 Platform Framework 中能嵌入脚本引擎,而不是用 ipy.exe 去执行一个“独立”的任务。要让.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(“x”);

  可以看出 ScriptScope 可以在 Host 和 ScriptRuntime 间传递数据。

  4、对象实例共享

  以下为引用的内容:

 
 
var py = @" o.X = o.X + 2;
  print o.X;
" var engine = Python.CreateEngine();
  var code
= engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements);
  var scope
= engine.Runtime.Globals;
  var o
= new Data { X = 123 };
  scope.SetVariable(
" o " , o);
  code.Execute(scope);
  Console.WriteLine(o.X);

  载入程序集并由ScriptRuntime管理

  5、创建程序集test.dll

  以下为引用的内容:

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

  创建Host程序

  以下为引用的内容:

 
 
var py = @" import clr;
  from My.Library import MyClass;
  from System import Console;
  o = MyClass();
  x.X = o.Test(x.X);
  Console.WriteLine(x.X);
" var engine = Python.CreateEngine();
  engine.Runtime.LoadAssembly(Assembly.GetAssembly(
typeof ( int ))); // mscorlib.dll
  engine.Runtime.LoadAssembly(Assembly.LoadFrom( " test.dll " )); // test.dll
  var code = engine.CreateScriptSourceFromString(py, SourceCodeKind.Statements);
  var scope
= engine.Runtime.Globals;
  var x
= new Data { X = 123 };
  scope.SetVariable(
" x " ,x);
  code.Execute(scope);
  Console.WriteLine(x.X);

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

  以下为引用的内容:

 
 
var py = @" class Class1:
  def __init__(self):
  self.i = 100
  def inc(self):
  self.i=self.i+100
  o = Class1()
" var o = scope.GetVariable( " o " );
  var i
= engine.Operations.GetMember(o, " i " );

  读取Python上下文对象实例方法

 
 
engine.Execute( " o.inc() " , scope); // 已经在上下文环境中执行此对象方法
目录
相关文章
|
3月前
|
PHP Windows
php扩展com_dndnet(PHP与.NET框架进行交互)
php扩展com_dndnet(PHP与.NET框架进行交互)
php扩展com_dndnet(PHP与.NET框架进行交互)
|
4月前
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
41 0
|
4月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
65 0
|
12月前
|
缓存 前端开发 JavaScript
采用.Net Core技术框架开发的医院云LIS平台源码,B/S架构
基于B/S架构的医学实验室检验系统源码,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器软件有外网即可访问。全套系统采用云部署模式,部署一套可支持多家医院检验科共同使用。 采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。
|
安全 NoSQL MongoDB
.Net线程同步技术解读
C#开发者(面试者)都会遇到lock(Monitor),Mutex,Semaphore,SemaphoreSlim这四个与锁相关的C#类型,本文期望以最简洁明了的方式阐述四种对象的区别。
.Net线程同步技术解读
|
移动开发 负载均衡 前端开发
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
143 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
|
网络架构
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
162 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
|
SQL 运维 监控
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
177 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0
|
30天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
28 0