一起谈.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); // 已经在上下文环境中执行此对象方法
目录
相关文章
|
1月前
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
7月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
290 0
|
11月前
|
消息中间件 存储 JSON
Net使用EasyNetQ简化与RabbitMQ的交互
EasyNetQ是专为.NET环境设计的RabbitMQ客户端API,简化了与RabbitMQ的交互过程。通过NuGet安装EasyNetQ,可轻松实现消息的发布与订阅,支持多种消息模式及高级特性。文中提供了详细的安装步骤、代码示例及基础知识介绍,帮助开发者快速上手。关注公众号“Net分享”获取更多技术文章。
316 1
Net使用EasyNetQ简化与RabbitMQ的交互
|
11月前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
180 6
|
11月前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
180 6
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
249 3
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
125 3
|
11月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
331 5
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
436 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
228 7

热门文章

最新文章

下一篇
oss云网关配置