主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#: コンパイルされたIronPythonクラスを使う

                
 IronPythonスクリプトをDLLにすることができる。今回はそれをC#から読み込んで、IronPythonのクラスをどうやってC#に持ち込むかををやってみる。ついでに、IronPythonでの型がC#にどう持ち込まれるかを調べる。参考は下記。
http://www.ironpython.info/index.php/Using_Compiled_Python_Classes_from_.NET/CSharp_IP_2.6

まずIronPythonでクラスを用意する。スクリプト名はMyClass.py。SharpDevelopでPythonのクラスプロジェクトでこのスクリプトを作成した。だからコンパイルはSharpDevelopからビルドで行った。DLLのファイル名はIpyClass.dll
class IpyClass:
def __init__(self):
self.pString = "IronPython"
self.pNum = 2.7
self.pList = [x for x in xrange(10)]
self.pTuple = (0, 1, 2, 3, 4,)
self.pDict = {x:x for x in xrange(10)}

def method(self):
print "I'm in IronPython script"
return False


IronPythonスクリプトをコンパイルしてDLLにしたら、つづいてC#でこれを読み込むためのプロジェクトを立てる。さきほどのIpyClass.dllと、IronPythonをC#で動かすための、
IronPython.dll
IronPython.Modules.dll
Microsoft.Scripting.dll
への参照を追加。

IronPythonのクラスを呼んでも、そのメソッドやプロパティを普通のクラスメンバのように使うことはできない。ちょっと手間がいる。(オブジェクトマッパーみたいのがあればなぁ……)
IronPythonの文字列型と数値型はそのままC#でSystem.String、System.Doubleとなる。リスト、タプル、辞書はそれぞれIronPython固有の型になるが、System.Collections.Genericにある型を使って読み込める。リストとタプルはIList、辞書はIDictionaryを使った。実行結果はスクリプトの下に。


using System;
using System.IO;
using System.Reflection;
using System.Collections.Generic;
using IronPython.Hosting;

using Microsoft.CSharp;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
// we get access to Action and Func on .Net 4.0 through Microsoft.Scripting.Utils
//using Microsoft.Scripting.Utils;

namespace TestIpyClass
{
class Program
{
public static void Main()
{
// TODO: Implement Functionality Here
ScriptEngine pyEngine = Python.CreateEngine();

// load IronPython class
Assembly myclass = Assembly.LoadFile(Path.GetFullPath("IpyClass.dll"));
pyEngine.Runtime.LoadAssembly(myclass);
ScriptScope pyScope = pyEngine.Runtime.ImportModule("MyClass");
object IpyClass = pyEngine.Operations.Invoke(pyScope.GetVariable("IpyClass"));

// execute a method
Console.WriteLine("Execute method");
var result = pyEngine.Operations.InvokeMember(IpyClass, "method", new object[0]);
Console.WriteLine(result);
Console.WriteLine("**********************\n");

// check properties
Console.WriteLine("Check properties");
var str = pyEngine.Operations.GetMember<object>(IpyClass, "pString");
var num = pyEngine.Operations.GetMember<object>(IpyClass, "pNum");
IList<object> list = pyEngine.Operations.GetMember<IList<object>>(IpyClass, "pList");
IList<object> tuple = pyEngine.Operations.GetMember<IList<object>>(IpyClass, "pTuple");
IDictionary<object, object> dict = pyEngine.Operations.GetMember<IDictionary<object, object>>(IpyClass, "pDict");

Console.Write(str);
Console.WriteLine(": " + str.GetType());
Console.WriteLine("**********************\n");

Console.Write(num);
Console.WriteLine(": " + num.GetType());
Console.WriteLine("**********************\n");

Console.Write(list);
Console.WriteLine(": " + list.GetType());
Console.WriteLine(list[0]);
Console.WriteLine("**********************\n");

Console.Write(tuple);
Console.WriteLine(": " + tuple.GetType());
Console.WriteLine(tuple[0]);
Console.WriteLine("**********************\n");

Console.Write(dict);
Console.WriteLine(": " + dict.GetType());
Console.WriteLine(dict[0]);
Console.WriteLine("**********************\n");

Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}



130325.png
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。