Как вызвать метод IronPython 2 из C # - PullRequest
1 голос
/ 11 сентября 2009

Я могу получить класс IronPython 2 обратно на мой C #. Каков новый способ вызова 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, создающий класс, плюс область, которая возникает в результате этого выполнения.

1 Ответ

3 голосов
/ 11 сентября 2009

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

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]);
...