IronPython 2.0 beta 5

ironpython 2.0 beta 5 已经发布,下载地址:http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=15625。IronPython 2.0 Beta 5是2.0系列的最后一个beta版本,下个版本就是RC版了。也就是说到了下个版本所有API都将固化了。现在也是到学习IronPython 2的时间了。从beta 4发布就有了msi 安装文件,并且带来了python的标准库 ,标准库的许可是以Python Software Foundation license 发布,这也就意味着移值cpython应用会很容易了。

值得注意的是带来了DLR hosting spec 的稳定版本,你可以从这里下载 DLR hosting spec的word 版本 http://compilerlab.members.winisp.net/dlr-spec-hosting.doc

这个版本还有一个最明显的变化的是命名空间作了个重大的修改,把所有的DLR 类型从System移到了Microsoft,原因是http://lists.ironpython.com/pipermail/users-ironpython.com/2008-August/thread.html#8036 许多人把IronPython嵌入到C# (.NET 3.5)项目中。

另外一点是DLR 宿主API不有一个针对Python的默认配置,现在应该用IronPython.Hosting.Python去创建脚本引擎,这样在应用程序中宿主IronPython就更容易了。IronPython.Hosting.Python有几个辅助方法,以创建一个ScriptRuntime或ScriptEngine ,并为ScriptRuntime和ScriptEngine增加了一些Python-specific 扩展方法。

using IronPython.Hosting; 
ScriptEngine engine = Python.CreateEngine(); 
ScriptScope sys = engine.GetSysModule();
 var platform = sys.GetVariable("platform");
 Console.WriteLine(platform); 
ScriptScope builtins = engine.GetBuiltinModule();
 var pow = builtins.GetVariable<Func<double, double,double>>("pow");
 Console.WriteLine(pow(2,3)); 
ScriptScope clr = engine.GetClrModule();
 var getPythonType = clr.GetVariable<Func<Type, PythonType>>("GetPythonType");            
 Console.WriteLine(PythonType.Get__name__(getPythonType(typeof(string)))); 

引用:http://blogs.msdn.com/srivatsn/archive/2008/09/16/hosting-ironpython-made-easier.aspx

如何在托管语言中调用动态语言。

首先,我们需要初始化动态语言的环境配置,从中获取所有可以使用的动态语言列表,然后得到相应动态语言的运行引擎。

ScriptRuntimeSetup setup = new ScriptRuntimeSetup(true); //true表示载入所有支持的动态语言的环境配置
 ScriptRuntime runtime = ScriptRuntime.Create(setup); //创建动态语言运行环境
 
 foreach (LanguageProviderSetup langSetup in setup.LanguageProviders) //遍历所有动态语言的环境配置
 {
 try
     {
 ScriptEngine engine = null;
 if (runtime.TryGetEngine(langSetup.Names[0], out engine)) //尝试获取动态语言的运行引擎
         {
 //engine就是我们需要的运行引擎
         }
     }
 catch (MissingTypeException) //处理创建不支持的动态语言时可能抛出异常
     {
     }
 }
 

获取了运行引擎后,我们就可以执行动态语言的代码了

public class MyErrorSink : ErrorSink //编译错误处理
 {
 IList<string> m_ErrorMsg = new List<string>();
 public IList<string> ErrorMsg
     {
 get { return m_ErrorMsg; }
     }
 
 public MyErrorSink()
     {
     }
 public virtual void Add(SourceUnit source, string message, SourceSpan span, int errorCode, Severity severity)
     {
 if (severity == Severity.Error || severity == Severity.FatalError)
         {
             m_ErrorMsg.Add(message);
         }
     }
 }
 
LanguageContext langContext = HostingHelpers.GetLanguageContext(engine);
 SourceUnit sourceUnit = langContext.CreateSourceUnit(new SourceStringContentProvider("1/4+3"), null, SourceCodeKind.Expression); //创建代码序列:1/4+3
 
 MyErrorSink errorSink = new MyErrorSink();
 try
 {
 Scope scope = new Scope();
 object ret = sourceUnit.Execute(scope, errorSink); //执行动态语言代码,ret就是执行结果的返回值了
 
 if (errorSink.ErrorMsg.Count > 0) //检查编译错误
     {
 //
     }
 }
 catch (Exception)
 {
 }
 

引用: http://blogs.msdn.com/silverlightshanghai/archive/2008/09/18/dlr-in-silverlight.aspx

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏分布式系统和大数据处理

基于业务对象(列表)的筛选

可能大家对SQL语句太过熟悉了,也可能虽然已经从Asp过度到了Asp.Net时代,但是Asp的观念没有发生太大变化。结果就是我们将应用程序大部分的逻辑都交给了数...

11150
来自专栏大内老A

WCF后续之旅(6): 通过WCF Extension实现Context信息的传递

在上一篇文章中,我们讨论了如何通过CallContextInitializer实现Localization的例子,具体的做法是将client端的culture通...

28360
来自专栏架构师之路

Google-LevelDB简介

LevelDB简介 LevelDB一句话描述 LevelDB是google开发的,一个速度非常块的KV存储库(storage library),它支持字符串的k...

52650
来自专栏分布式系统和大数据处理

C#网络编程(订立协议和发送文件) - Part.4

前面两篇文章所使用的范例都是传输字符串,有的时候我们可能会想在服务端和客户端之间传递文件。比如,考虑这样一种情况,假如客户端显示了一个菜单,当我们输入S1、S2...

10910
来自专栏高性能服务器开发

redis网络通信模块源码分析(下)

这里注册可写事件AE_WRITABLE的回调函数是sendReplyToClient。也就是说,当下一次某个触发可写事件时,调用的就是sendReplyToCl...

41840
来自专栏大内老A

WCF后续之旅(6): 通过WCF Extension实现Context信息的传递

在上一篇文章中,我们讨论了如何通过CallContextInitializer实现Localization的例子,具体的做法是将client端的culture通...

21570
来自专栏lulianqi

一个基于.NET平台的自动化/压力测试系统设计简述

AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持。(本质是一个...

24310
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 global全局变量

global 全局变量 global用来定义全局变量,它可以让应用程序的对象在规则文件中能够被访问。通常,可以用来为规则文件提供数据或服务。特别是用来操作规则执...

32660
来自专栏hotqin888的专栏

DOC文件中法规对标系统完成

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

8210
来自专栏葡萄城控件技术团队

ASP.NET MVC 5 - 给数据模型添加校验器

在本节中将会给Movie模型添加验证逻辑。并且确保这些验证规则在用户创建或编辑电影时被执行。 拒绝重复 DRY ASP.NET MVC 的核心设计信条之一是DR...

22570

扫码关注云+社区

领取腾讯云代金券