時間過得真快,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的解決方案項目,簡單方便省事。
幾乎不用任何配置,直接安裝下載回到的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項目
請先到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代碼中。最后,我需要一個靈活方便的腳本編輯工具,並且可以提供強大的調試功能。