Using Ironpython as Script Engine in C# Basic Setup

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感兴趣,需要建立简单测试环境的各位有帮助:).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值