Cで作ったDLLを呼び出す場合には引数の型などを調べておく必要があり,渡す際も戻しを受け取る場合にも変数型を意識する必要がある。ところが,Python for .NETのDLLの呼び出しの場合にはある程度 自動で型合わせを行ってくれる。
例えばWinPythonについてくるpythonnetで以下のDLLを呼び出してみる。
次のようなコードでTestLibraryName.dllをビルドした。
using System; using System.Collections.Generic; using System.Text; namespace TestLibraryName // dllの名前と同じだと失敗する { public class TestClass { public string Test(string a) { return "OUT:" + a; } public byte[] Test2(byte[] a) { for (int i = 0; i < a.Length; i++) { a[i] = (byte)(2 * a[i]); } return a; } public Int32[] Test3(ref Int32[] a) { for (int i = 0; i < a.Length; i++) { a[i] = (Int32)(2 * a[i]); } return a; } public Int32[] Test4(Int32[] a) { for (int i = 0; i < a.Length; i++) { a[i] = (Int32)(2 * a[i]); } return a; } } }
Python側に以下のようなコードを用意してみた。
import clr clr.AddReference('TestLibrary') from TestLibraryName import TestClass import System testClass = TestClass() # list in Python => .NET array a = [1, 2, 3] b = testClass.Test2(a) for i in range(b.Length): print(b[i]) print() # .NET array => Reference of .NET array c = System.Array[int](a) d = testClass.Test3(c) for i in range(c.Length): print(c[i]) print() # .NET array => .NET array c = System.Array[int](a) d = testClass.Test4(c) for i in range(c.Length): print(c[i]) print()
この場合,一番最初の部分でPythonのlistが.NET側でちゃんと配列に直っている。
もう少しサンプルをあさってみたい。
今のところ,C#やVB.NETのdelegateをPythonで作るのがうまくいっていない。.NETにはDelegateクラスが用意されていたと思うので使えるのではないかと思って探している。