IronPython2.7 & C# 4.0 互调用备忘

本文介绍了一个使用IronPython与C#进行交互调用的实际案例,演示了如何从C#环境中加载并执行Python脚本,同时展示了数据表操作、方法调用及变量传递的过程。

查了些资料,自己再测试后发现,IronPython已经蛮方便与C#互调用了

<!-- lang: c# -->
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Linq;
using System.IO;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.Reflection;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
using Microsoft.Scripting;

namespace ConsoleApplicationTest
{


public class Program
{
    public delegate void OutPut_delegate(object s);

    public string OutPut_instance(object s)
    {
        Console.WriteLine("对象方法调用 OutPut_Pri {0} ", s.ToString());
        return "return 国语 in charp";
    }

    static public void OutPut_static(object s)
    {
        Console.WriteLine("in C# 静态方法 OutPut {0} ", s.ToString());
    }

    static void OutPut(object s)
    {
        Console.WriteLine("C# 委托测试 {0} ", s.ToString()); 
    }

    public int abc;

    static void Main(string[] args)
    {
        OutPut_delegate output = OutPut;
        DataTable dt = new DataTable();
        dt.Columns.Add("count", typeof(int));
        dt.Columns.Add("calc", typeof(int));
        dt.Rows.Add(1, null);

        var engine = Python.CreateEngine(); 
        var runtime = engine.Runtime;
        
        try 
        {
            Program program = new Program();
            dynamic test = runtime.UseFile(@"d:\test.py");
            int abc =100;

            //ref out等方法也不能在python中修改再返回C#,因此要用实体类的方法来传值
            Console.WriteLine("return value is {0}", test.MyFunction(dt, ref abc, output, program));
            foreach (DataRow dr in dt.Rows)
                Console.WriteLine(dr["count"]);
            Console.WriteLine(program.abc);//会发生变化
            Console.WriteLine(abc);//不会发生变化
        }
        catch (Exception ex)
        {
            var eo = engine.GetService<ExceptionOperations>();
            Console.WriteLine(eo.FormatException(ex));
        }
    }
}

}

<!-- lang: python -->
# -*- coding: utf-8 -*-
#下面3行只有需要调用静态方法时才需要
import clr, sys
clr.AddReference('ConsoleApplicationTest')
from ConsoleApplicationTest import *

def MyFunction(dt, abc, output, instance):
abc = 999
print instance
for row in dt.Rows:
    row["count"] = row["count"] * 2
print( output( "in python2" ) )
print instance.OutPut_instance("in python3")
instance.abc = 999
print dt
print output 

Program.OutPut_static("静态方法调用")
return " 中文  in python"

转载于:https://my.oschina.net/sqhua/blog/187543

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值