Как вызвать метод IronPython 2 из C#

Я могу вернуть класс IronPython 2 на свой С#. Каков новый способ IronPython 2 для вызова члена этого класса?

object ironPythonClass = scope.GetVariable("Hamish");
object[] args = new object[0];
object pythonObject = engine.Operations.Call(ironPythonClass, args);

var member = "Home";
// old way IronPython 1
// var methodResult = Ops.Invoke(this.pythonObject, SymbolTable.StringToId(member), args);

Я думал, что все, что мне нужно сделать, это

var methodResult = PythonOps.Invoke(codeContext, pythonObject, SymbolTable.StringToId(member), args);

но создание фиктивного CodeContext кажется неправильным. Я чувствую, что должен быть в состоянии вывести один из моих

code.Execute();

который запускает файл Python, создающий класс, а также область действия, возникающую в результате этого выполнения.


person Hamish Gunn    schedule 11.09.2009    source источник


Ответы (1)


Нашел способ сделать это:

var ops = engine.Operations;
var x = ops.GetMember(pythonObject, member);
var h = ops.Call(x, new object[0]);

Похоже, что Operations создает объект OperationsObject с полезными членами.

Однако, глядя на код DLR (Microsoft.Scripting.Hosting), я вижу, что Call устарел:

[Obsolete("Use Invoke instead")]
public object Call(object obj, params object[] parameters) {
    return _ops.Invoke(obj, parameters);
}

Однако моя версия сценария 0.9.20209 еще не имеет Invoke.

После обновления до более новой версии IronPython 2.6Beta и ее библиотек сценариев я обнаружил, что могу написать:

var h = ops.InvokeMember(pythonObject, member, new object[0]);
person Hamish Gunn    schedule 11.09.2009
comment
Обновлен до бета-версии 2.6 с более новыми библиотеками сценариев — теперь я могу писать: var h = ops.InvokeMember(pythonObject, member, new object[0]); - person Hamish Gunn; 11.09.2009