IronPython 与C#交互

http://www.cnblogs.com/nuaalfm/archive/2010/02/11/1667448.html   一、介绍 Python是一种面向对象、直译式计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。目前,基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多。 IronPython是由Jim Hugunin在微软领导开发的一个.NET平台上的Python实现,包括了完整的编译器、执行引擎与运行时支持,能够与.NET已有的库无缝整合到一起。微软对于.NET framework的IronPython和动态语言非常关注,已经在各种项目中提供了对IronPython的支持。IronPython已经很好的集成到了.NET framework中,Python语言中的字符串对应于.NET的字符串对象,并且Python语言中对应的方法,在IronPython中也都提供了。其它数据类型也是一样。 作者 参考: 了解DLR: http://rednaxelafx.javaeye.com/blog/241430 jim的博客:http://blogs.msdn.com/hugunin/default.aspx http://developer.51cto.com/art/200910/156377.htm http://www.msuniversity.edu.cn/m_LearnCenterInfo/Detail.aspx?id=102 二、基础知识 1、安装 因为我目前使用的是vs2008所以到http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12482下载2.6正式版,我下的是IronPython-2.6.msi ,直接安装就行了。默认的安装路径应该是C:\Program Files\IronPython 2.6 2、引入相应的dll 创建一个控制台应用程序,然后到C:\Program Files\IronPython 2.6中引用IronPython.dll,Microsoft.Scripting.Core.dll,Microsoft.Scripting.dll三个dll。 3、应用 C:\Program Files\IronPython 2.6\Tutorial\Tutorial.htm是IronPython的应用指导,写的很仔细。ipy.exe是IronPython 的运行控制台,如果你想学习IronPython 的语法可以使用这个工具。IronPython 的语法这里就不详细介绍了,如果想进一步学习,可以下载IronPython in Action。 三、IronPython 与C#交互 1、C#使用IronPython 代码 我们希望在C#中直接运行IronPython 中的代码,比方说1+2的结果值  
ScriptEngine engine = Python.CreateEngine(); ScriptScope scope = engine.CreateScope(); var strExpression = "1+2"; var sourceCode = engine.CreateScriptSourceFromString(strExpression); var actual = sourceCode.Execute<int>(); Console.WriteLine(actual);
    执行结果: 3 ScriptEngine和ScriptScope是在.net中使用IronPython 脚本的两个基础类,ScriptSource是运行IronPython 的基础类,这里边sourceCode就是一个ScriptSource。 有时我们希望给IronPython 代码中传入一个变量值  
复制代码
ScriptEngine engine = Python.CreateEngine(); ScriptScope scope = engine.CreateScope(); var strExpression = "\"Hello:\" + str"; var sourceCode = engine.CreateScriptSourceFromString(strExpression); scope.SetVariable("str", "Python"); var actual = sourceCode.Execute<string>(scope); scope.RemoveVariable("str"); Console.WriteLine(actual);
复制代码
  执行结果: Hello:Python 2、C#调用IronPython 函数 调用IronPython 中的MyFunction函数  
复制代码
var strExpression = @" def MyFunction(n): return 2*n "; var sourceCode = engine.CreateScriptSourceFromString(strExpression).Compile().Execute(scope); var func = engine.GetVariable<Func<int, int>>(scope, "MyFunction"); Console.WriteLine(func(3));
复制代码
  这里需要注意def MyFunction(n):前不能有空格,return 2*n 必须有空格 3、IronPython 调用C#函数 在IronPython 中调用C#中已经存在的函数    
复制代码
static void Main(string[] args) { ScriptEngine engine = Python.CreateEngine(); ScriptScope scope = engine.CreateScope(); var strExpression = "CMethod('Python')"; var sourceCode = engine.CreateScriptSourceFromString(strExpression); scope.SetVariable("CMethod", (Func<string, string>)TMethod); var actual = sourceCode.Execute<string>(scope); scope.RemoveVariable("CMethod"); Console.WriteLine(actual); } public static string TMethod(string info) { return "Hello:" + info; }
复制代码
  如果需要使用某个对象中的某个函数  
复制代码
 Test test = new Test(); var strExpression = @" test.Hello() "; var sourceCode = engine.CreateScriptSourceFromString(strExpression); scope.SetVariable("test", test); var actual = sourceCode.Execute<string>(scope); Console.WriteLine(actual);
复制代码
  如果需要在IronPython 实例化使用某个对象,就稍微复杂点,这里我们创建了一个IronPythonTest程序集,我们希望在IronPython代码中使用IronPythonTest程序集中的Test类,代码如下:  
复制代码
var strExpression = @" import clr, sys clr.AddReference('IronPythonTest') from IronPythonTest import * test=Test() test.Hello() "; var sourceCode = engine.CreateScriptSourceFromString(strExpression); var actual = sourceCode.Execute<string>(scope); Console.WriteLine(actual);
复制代码
  Test代码:
复制代码
namespace IronPythonTest { public class Test { public string Hello() { return "Hello World"; } } }
复制代码
clr.AddReference('IronPythonTest')是用来添加程序集的 from IronPythonTest import *是用来添加命名空间的 参考: http://www.236z.com/html/30/6/9/2009/11/10/67471.html IronPython和C#执行速度对比
posted @ 2014-06-16 17:28  adodo1  Views(266)  Comments(0Edit  收藏  举报