如果你下载了最新的ironpython 2 (a1和a2),你会发现早先1中 教程中的: IronPyton as applications scripting engine 一节不见了.老的1.x中的方法也通不过了. 那么,我们要怎样将 ironpython作为脚本引擎嵌入到我们的应用程序中呢 ,答案在Microosft.Scripting.dll中 的 using Microsoft.Scripting Script.SetVariable('x',5); Script.Execute('py','print x'); 就是这样简单 btw : ironpython 2.0的a2版本由于由于没有修改language provider的版本(应该是2.0.0.200而不是早先的2.0.0.100),不能运行以上代码 Script 解决了几个问题 1. 首先是生存期的问题,Script将所有的调用都转发到ScriptDomainManager.CurrentManager,CurrentManager是ScriptDomainManager的一个singleton实例. 这样,省去了我们自己维护脚本引擎生存期的必要. 2. 正如ScriptDomainManager的命名,它是一个脚本引擎的管理器. 目前,它通过ScriptEnvironmentSetup 注册了ironpython,js,vb,ruby ,显然,目前仅ironpython可用. 现在,可以真正的替换dotnettools workflow中的脚本功能了,我目前做了以下修改 1. 移去了早期的脚本配置功能(早期用于预先引入assembly和导入namespace) 2. 移去了ironpython实现,重新实现基于Microsoft.Scripting的ScriptingValidator,ScriptingFunctionProvider,ScriptingRegister,ScriptingCondition 下面是新的配置文件,大家可以看到脚本的function,condition的type为scripting,如果没有设置脚本类型,则默认为py,否则,你可以在args中增加<arg name="language">vb</arg>,同样,现在你可以增加<arg name="source">test.py</arg>来从一个文件中运行脚本(source 和script是互斥的)
<?xml version="1.0" encoding="utf-8" ?> <workflow xmlns="http://www.soho-works.net/workflow"> <initial-actions> <action id="1" name="Start Workflow"> <pre-functions> <function type="scripting"> <arg name="script"> <![CDATA[ #用来引入assmebly和命名空间 import clr clr.AddReference("DotNetTools.Core") clr.AddReference("DotNetTools.PropertySet") clr.AddReference("DotNetTools.Workflow") from DotNetTools.Workflow import * from DotNetTools.Workflow.Basic import * from System import Console Console.WriteLine('start workflow') ]]> </arg> </function> </pre-functions> <results> <unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/> </results> </action> </initial-actions> <steps> <step id="1" name="First Step"> <actions> <action id="2" name="The first action" auto="true"> <pre-functions> <function type="scripting"> <arg name="script"> transientVars.Add("test", "this is a test") </arg> </function> </pre-functions> <results> <result old-status="Finished" status="Queued" step="2"> <conditions> <condition type="scripting"> <arg name="script">result=(transientVars["test"]==None)</arg> </condition> </conditions> <pre-functions> <function type="scripting"> <arg name="script"> Console.WriteLine("From ConditionalResult: " + transientVars["test"]) </arg> </function> </pre-functions> </result> <unconditional-result old-status="NotPassed" status="Queued" step="3"> <pre-functions> <function type="scripting"> <arg name="script"> Console.WriteLine(transientVars["test"]) Console.WriteLine('this is lastfunction') </arg> </function> </pre-functions> </unconditional-result> </results> </action> </actions> </step> <step name="end" id="2"/> <step name="end2" id="3"/> </steps> </workflow>
|