Запуск объекта IronPython из С# с динамическим ключевым словом

У меня есть следующий код IronPython.

class Hello:
    def __init__(self):
        pass
    def add(self, x, y):
        return (x+y)

Я мог бы сделать следующий код C# для использования кода IronPython.

static void Main()
{
    
    string source = GetSourceCode("ipyth.py");
    Engine engine = new Engine(source);
    ObjectOperations ops = engine._engine.Operations;

    bool result = engine.Execute();
    if (!result)
    {
        Console.WriteLine("Executing Python code failed!");
    }
    else
    {
        object klass = engine._scope.GetVariable("Hello");
        object instance = ops.Invoke(klass);
        object method = ops.GetMember(instance, "add");
        int res = (int) ops.Invoke(method, 10, 20);
        Console.WriteLine(res);
    }

    Console.WriteLine("Press any key to exit.");
    Console.ReadLine();
}

Могу ли я упростить этот код с помощью динамической DLR?

В книге IronPython In Action есть простое объяснение этого в ‹15.4.4 Будущее взаимодействия с динамическими объектами ›, но я не смог найти несколько примеров.

ДОБАВЛЕН

Прилагаю исходный/баточный файл программы. Program.cs runme.bat


person prosseek    schedule 11.10.2010    source источник


Ответы (1)


Да, динамический может сделать ваш код проще

        var source =
            @"
class Hello:
def __init__(self):
    pass
def add(self, x, y):
    return (x+y)

";

        var engine = Python.CreateEngine();
        var scope = engine.CreateScope();
        var ops = engine.Operations;

        engine.Execute(source, scope);
        var pythonType = scope.GetVariable("Hello");
        dynamic instance = ops.CreateInstance(pythonType);
        var value = instance.add(10, 20);
        Console.WriteLine(value);

        Console.WriteLine("Press any key to exit.");
        Console.ReadLine();
person desco    schedule 11.10.2010
comment
@desco: я запустил код, чтобы получить следующую ошибку. Необработанное исключение: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: IronPython.Runtime.Types.OldInstance' does not contain a definition for add' at (динамический метод оболочки) object.CallSite.Target (System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,object,int,int) ‹0x0006c › at System.Dynamic.UpdateDelegates.UpdateAndExecute3‹object, int, int, object› (System.Runtime.CompilerServices.CallSite,object,int,int) ‹0x00304› at BasicEmbedding.Program.Main() ‹0x001b9› - person prosseek; 12.10.2010
comment
@desco: я использую mono 2.6, который поддерживает .NET 4.0. - person prosseek; 12.10.2010
comment
просто интересно, в ваших источниках Python замените «класс Hello:» на «класс Hello (объект):» - person desco; 12.10.2010
comment
@desco: Привет (объект) не работает. Я скопировал py.exe в Windows и получил ту же ошибку. Возможно, Mono 2.6 не полностью поддерживает DRL. - person prosseek; 12.10.2010
comment
@desco: я пытался скомпилировать/запустить исходный код в Windows 7, но получил ту же ошибку. Не могли бы вы проверить это для меня? Я добавил исходный код и пакетный файл в исходный пост. - person prosseek; 12.10.2010
comment
да, проверял, все работает как шарм, Win XP, Iron Python 2.6.1 для .NET 4.0 - person desco; 12.10.2010