Silverlight下面的IronPyton(1)
学习背景:
项目中需要一种脚本,可以与静态语言进行交互,比如引入外部的dll,实例化一个对象,修改页面上控件的属性等
翻阅了很多资料,测试了几种脚本,c#-script,天使坠同志写的RoughScript 1.3版,JavaScript,Jscript,IronPython,IronRuby,最终认为IronPython,IronRuby可以满足项目的基本要求。
下面看看silverlight下面IronPython基本的应用:
1:首先了解一下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)。
我自己所做的简单的测试代码如下 :
namespace SilverlightApplication1
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
#region demo1 字条串的输出
//var strExpression = "\"Hello:\" + str";
//var sourceCode = engine.CreateScriptSourceFromString(strExpression); //脚本是一个字条串
//scope.SetVariable("str", "Python"); //注册一个脚本变量,可以参与运算
//var actual = sourceCode.Execute<string>(scope);//执行脚本
//scope.RemoveVariable("str");//移除脚本变量
//txt.Text = actual;
#endregion
#region demo2 在脚本中定义一个函数
//这里需要注意def MyFunction(n):前不能有空格,return 2*n 必须有空格
/* 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");
txt.Text =func(3).ToString();*/
#endregion
#region demo3
/* var strExpression = "CMethod('python,tiger')";
var sourceCode = engine.CreateScriptSourceFromString(strExpression);
scope.SetVariable("CMethod", (Func<string, string>)TMethod);
var actual = sourceCode.Execute<string>(scope);
scope.RemoveVariable("CMethod");
txt.Text = actual;*/
#endregion
#region demo4
/* Test test = new Test();
var strExpression = @"test.Hello()";
var sourceCode = engine.CreateScriptSourceFromString(strExpression);
scope.SetVariable("test", test);
var actual = sourceCode.Execute<string>(scope);
txt.Text = actual;*/
#endregion
/* #region demo5 在脚本中导入dll,测试失败,只能在外部文件中导入命名空间,以调用文件的方式执行,以语句的方式执行失败
var strExpression = @"import clr
clr.AddReference('System.Windows.Controls')
from System.Windows.Controls import *
tt=Button()
tt.Content='dasf'
MessageBox.Show(tt.Content.ToString())
";
var sourceCode = engine.CreateScriptSourceFromString(strExpression);
sourceCode.Execute(scope);
//txt.Text = actual;
#endregion*/
}
public string TMethod(string info)
{
return "Hello:" + info;
}
}
public class Test
{
public string Hello()
{
return "Hello: tiger ,are you ok";
}
}
}
namespace IronPythonTest
{
public class Test
{
public string Hello()
{
return "Hello World";
}
}
}
以上是自己根据网上查询的资料自己做的测试,初步简单的在silverlight中调用了IronPtyhon
下面看看在silverlight中如何调用.py文件