Visual Studio 2010 开发与调试IronPython脚本 为你的ERP/MIS 应用程序添加脚本功能

时间过得真快,Visual Studio 2010推出来快两年了,.NET 4.0也逐渐普及。.NET 4里面有一项重要的功能,就是动态语言,可以在.NET代码中直接调用第三方的动态语言脚本,请参考下面的例子程序

ScriptRuntime py = Python.CreateRuntime();
//Dynamic feature only works on objects typed as 'dynamic'
dynamic helloworld = py.UseFile("helloworld.py");

Console.WriteLine("helloworld.py loaded!");
for (int i = 0; i < 1000; i++)
{
      Console.WriteLine(helloworld.welcome("Employee #{0}"), i);
}

这是Visual Studio 2010中使用IronPython的例子,为了运行这个程序,请下载IronPython, 例子中的的源代码如下

def welcome(name):
      return "Hello '" + name + "' from IronPython"

学到了这么多技术,最终都是为了改善产品,改善系统的可维护性。在之前的文章中我提到为应用程序添加脚本功能,可产生定制的动态的代码块,然后返回执行结果。这项功能为应用程序的灵活性提供了极大的方便。我在工作流的表达式求值,工资公式编辑器中有提到动态脚本Script.NET的能力。然而Script.NET停止开发很久了,而且我一直期盼的调试功能又没有实现出来。自己参考SharpDevelop做script debugger,没有结果,只好暂时停止对Script.NET的进一步探索与应用。现有IronPython 2.7.1 已经直接做成了Visual Studio的解决方案项目,简单方便省事。

image

几乎不用任何配置,直接安装下载回到的IronPython-2.7.1安装文件即可,它会为你的Visual Studio创建Python项目模板。在x86的电脑上,可以产生四个类型的项目模板,Console Application,WinForms Application,IronPython Silverlight Web Page,Wpf Application,而在x64的平台上,只产生了Console Application项目模板。

 

但是,这样还有点不方便,Python在这里被当成脚本语言,它的Build Action=None,意味着没有任何编译行为,这样会给代码的调试工作带来不方便之处。需要安装工具Python Tools for Visual Studio。

先卸载已经安装的IronPython工具包,才能继续安装Python Tools for Visual Studio。安装完成之后,项目模板又多了二项模板,Python Application和Python MPI Application。新建立一个Python Application项目

image

请先到Tools->Options的Python Tools中新建一个Interpreter,在Interpreter Options中点击Add Interpreter按钮,保存退出即可。然后就可直接在编辑器中放断点,调试的体验和调试.NET语言一样,Call Stask,Intermediate Window,Watch窗口都可用,这种感觉是相当的方便。再看看Program.py的文件属性,它的Build Action=Compile。

在安装工具包的同时,也同时会安装Python的命令行交互程序,这个程序可以当计算器用,直接输入表达式的值,它可以马上帮助你计算出结果。再来看看下面的Python的两个例子代码,以帮助你了解和学习这种语言。

 

Lambda表达式,这个可以简化代码的编写,请看Python的实现

func = lambda s: s * 3
print func("peter ")  

func2 = lambda a, b: a * b
print func2(2, 3)  

调试这段代码,在Output窗口可以显示它的执行结果。Lambda表达式减少了很多不必要的代码。

 

Python的for循环语句,它的一种写法是这样的

for i in range(0, 10,2):
    print i

起始变量0,10是终止变量(不包括10),2是步长。.NET 4中引入了并行循环,它的代码例子如下

Parallel.For(0, Int64.MaxValue, i =>
            {
                 
                 Console.WriteLine("i={0},thread id={1}", i, Thread.CurrentThread.ManagedThreadId);
                 Thread.Sleep(1000);
            });
 

整理一下文章的思路,您首先要选择一门脚本语言,来为你的应用程序提供动态代码执行能力。在这里,我选择Python语言,并选择它的.NET实现版本IronPython。其次,我要对脚本与.NET host之间的代码互操作有所了解,如何把.NET的变量传到脚本中,如何传回脚本的执行结果到.NET代码中。最后,我需要一个灵活方便的脚本编辑工具,并且可以提供强大的调试功能。

posted @ 2012-01-05 09:25  信息化建设  阅读(5744)  评论(11编辑  收藏  举报