查了些资料,自己再测试后发现,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"