IronPython是Python在.NET Framework上的实现。使用Ironpython使我们可以在.NET环境下使用Python语言编程。同时,Ironpython可以直接调用.NET dll的类和方法,这就使Ironpython成为在.NET 环境下的一个很好的脚本语言。本文介绍在C#下一个简单的Ironpython脚本环境的建立过程。(本人比较懒,下面的内容会用一部分英文直接写。。。)
Before we introduce how to setup ironpython scripting environment in C#, let's briefly discuss why do we want an ironpython scripting environment. Using ironpython scripting environment in C# has the following benefits:
1. Writing IronPython script is generally more productive compared to C# code.
2. Ironpython does not require compile.
3. Ironpython code is released as pure text file which is more readable than compiled dlls.
也许有人会质疑Ironpython代码的执行效率。的确,脚本语言的执行效率一般会比编译语言要低。因此,脚本语言并不适合对执行效率要求很高的系统。那么,对于Ironpython以上的优势,我们应该在什么样的系统中使用Ironpython呢?My suggestion is as follows:
1. Prototyping
2. Business logic which is expected to change frequently in the future.
3. Maintaining Legacy system.
第一和第二点很好理解,我来解释一下第三点。对于大型系统维护和升级,特别是重要的和运行时间已经很长的系统,最大的难题往往不是如何进行代码修改,而是理解现有系统的功能。大型系统通常开发人员很多,开发跨度也很长,往往没有很详细的文档,或者文档已很久没有更新。面对这样的系统,如果代码是语法相对简单容易理解的脚本语言,将是对程序员巨大的帮助。
上面说了一些废话,下面我们介绍一个在C#中调用Ironpython脚本的例子。
首先,我们要加入以下dll引用:
Ironpython.dll, Ironpython.Modules.dll, Microsoft.Dynamic.dll, Microsoft.Scripting.Debugging.dll,和Microsoft.Scripting.dll.
然后看下面一个简单的测试程序例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IronPython;
using IronPython.Hosting;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
using System.Reflection;
using System.IO;
namespace IronPythonTest
{
class Program
{
static void Main(string[] args)
{
var engine = Python.CreateEngine(AppDomain.CurrentDomain);
var runtime = engine.Runtime;
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
runtime.LoadAssembly(assembly);
}
if (File.Exists("default_resources.txt"))
{
try
{
ScriptScope scope = engine.CreateScope();
ScriptSource source = engine.CreateScriptSourceFromFile("default_resources.txt", Encoding.ASCII, Microsoft.Scripting.SourceCodeKind.AutoDetect);
String[][] resources = source.Execute<String[][]>(scope);
foreach (String[] resource in resources)
{
Console.WriteLine(resource[0] + ":" + resource[1]);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
其中default_resources.txt的内容为以下Ironpyhon脚本:
import clr
from System import *
resource1 = Array.CreateInstance(str, 2)
resource1[0] = 'Resoure 1 - Yesterday Date'
date = DateTime.Now.Date.Subtract(TimeSpan(1, 0, 0 , 0)).Date
resource1[1] = date.ToString("yyyy-MM-dd HH:mm:ss")
resource2 = Array.CreateInstance(str, 2)
resource2[0] = 'Resource 2'
resource2[1] = 'Value'
Array[Array[str]]([resource1, resource2])
执行C#代码,我们得到以下结果:
Resoure 1 - Yesterday Date:2012-02-17 00:00:00
Resource 2:Value
Press any key to continue . . .
这样,一个很简单的利用Ironpython脚本向C#程序提供config值的程序就做好了。那么,在这个例子里面,Ironpython脚本提供的Config值比从.NET中最常用的appconfig xml文件读取有什么优势呢?我们来看看default_resources.txt中的resource1。resource1返回的是昨天的日期,如果我们用appconfig这个日期是静态的,而在ironpython中,这个日期则会根据程序运行的日期自行改变。
通过使用Ironpython脚本,可以使C#代码更加灵活,本文只介绍了一个很简单的环境搭建过程,希望对Ironpython感兴趣,需要建立简单测试环境的各位有帮助:).