最終更新日 2024-06-21

C#からIronPythonを利用してみる③

概要

前節までで、C#とIronPythonとのやりとりの基本は理解できました。
今節では実際に使用してみましょう。

HD.version.SDK側

HD.version.SDK側のソース
using System;
using System.Collections.Generic;


using IronPython.Hosting;
using Microsoft.Scripting.Hosting;


    /// これ以降は原則的には全て扱える。
    public static void My_ゲームウィンドウ起動時()
    {
        try
        {
            pe = Python.CreateEngine();
            scope = pe.ExecuteFile("script.py");
            // UseFile メソッドは Python 側で指定された検索パス上のファイルも探する。
            // ExecuteFile メソッドはそのような探索の機能を持っていない。指定の通りのファイルを読みこんで実行する。
        }
        catch (Exception ex)
        {
            デバッグ出力(ex.Message);
        }
    }


    private static ScriptEngine pe;
    private static dynamic scope;

    public static void My_戦略_軍団ターン変更時(int 軍団番号)
    {
        try {
            var blist = scope.武将フィルター(武将);
            foreach (int ix in blist)
            {
                デバッグ出力(武将.配列[ix].姓名);
            }
        } catch (Exception ex)
        {
            デバッグ出力(ex.Message);
        }

    }



Python側

「武将」クラスオブジェクトを受け取って、50歳を超える年齢の武将だけをList<int>に追加して返しています。

IronPythonのソース:script.py
# coding: utf8

from System.Collections.Generic import List

def 武将フィルター(武将):
    blist = []
    for b in 武将.配列:
        if b.年齢 > 50:
            blist.append(b.番号)

    blist_list = List[int](blist)
    return blist_list

これまでと変わるところはありません。

IronPythonのList[int](python_array)の部分は、C#のList<int>(int[])に相当します。

以上となります。

C#自体が優れているため、なかなかスクリプト言語に頼るといった機会は少ないかもしれませんが、
検討材料のひとつにしてください。