跨越编程语言界限(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoulinshijie/article/details/77389722

一、DLR的实现基础

1、动态对象通讯协议
设计了一个”通用的对象通讯协议”,规定所有需要互操作的动态对象必须实现IDynamicMetaObjectProvider接口,此接口定义了一个GetMetaObject()方法,接受一个语法树作为参数向外界返回一个”动态元数据”对象:
DynamicMetaObject GetMetaObject(Expression parameter);
DynamicMetaObject对象向外界提供了两个重要属性,Restrictions引用一组测试条件,Expression属性则引用一个语法树.这两个属性组合起来就是可供动态站点对象缓存的”规则(Rule)”。
DLR中的”动态站点绑定对象”获取了DynamicMetaObject对象之后,他调用此对象所提供的各个方法创建”规则”,让”动态站点对象(CallSite<T>)”的Target属性引用它,完成动态绑定的工作。

2、动态语言集成环境
为了方便的实现静态语言与各种动态语言间的相互集成,DLR提供了一整套称为“通用寄宿”的组件,其中包含ScriptRuntime,ScriptScope等类型。
利用DLR可以将静态和动态编程语言组合起来,开发出一些具有高度交互性的应用程序,使用静态编程语言搭建系统框架,使用动态编程语言实现交互性。

二、DLR主要提供的功能

1、语言实现服务提供语言的互操作性
2、动态语言运行时服务提供动态调用支持
3、公共脚本宿主

三、IronPython调用C#

1、 IronPython使用标准.NET库
from System import DateTime, String 
formatStr = String.Format("{0} {1}", "Hello World! The current date and time is ", DateTime.Now) 
print formatStr  
print dir(String)
raw_input("press Enter to exit!")

2、 IronPython引入.NET动态库
namespace CalcLib
{
    public class Calc
    {
        public int Add(int a, int b)
        {            return a + b;        }
        public int Sub(int a, int b)
        {            return a - b;        }
    }
}

import sys
sys.path.append(r'D:\python\IronPython\CalcLib\CalcLib\bin\x64\Release')
import clr
clr.AddReference('CalcLib')
#clr.AddReferenceToFile('CalcLib.dll')
from CalcLib import Calc
print dir(Calc)
calcObj = Calc()
print "result of 3+4 is:", calcObj.Add(3,4)
print "result of 10+2 is:", calcObj.Sub(10,2)
raw_input("press Enter to exit!")

四、在C#中直接使用IronPython

1、创建一个C# Console Project(注意需要.NET 4.0以上版本)

2、向解决方案中添加Ironpython.dll和Microsoft.Scripting.dll引用。

3、创建Python文件和C#文件

using IronPython.Hosting; //导入IronPython库文件
using Microsoft.Scripting.Hosting; //导入微软脚本解释库文件

ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
string script = "print('Hello world!')";
var sourceCode = engine.CreateScriptSourceFromString(script);
var result = sourceCode.Execute<object>(scope);
Console.WriteLine(result);

五、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)。


猜你喜欢

转载自blog.csdn.net/zhoulinshijie/article/details/77389722