1

Я программирование на С ++, которое было использовано для написания небольшого приложения в Visual Basic. В приложении находится среда выполнения IronPython, и я пытаюсь определить некоторую функцию в python, а затем вызвать их из VB. Я написал простую функцию тестирования в питонеВызов PythonFunction из приложения VB-приложения Iron Python

def test(): 
    print "Test was Called" 

Затем я использую железный питон создать ScriptSource из файла питона. Я могу найти переменную «test» через операции объекта, но я не могу понять, как вызвать объект, который. Так, например (в VB):

pyScope = engine.CreateScope() 
pySource = engine.CreateSourceFromFile("C:\Some\File\path\test.py") 
pySource.Execute(pyScope) 
' Now I expect the function test() to be defined in pyScope 
Dim tmp as Object 
pyScope.TryGetVariable("test", tmp) 

В этот момент в моем коде ТМП определяется как объект типа PythonFunction. Я не могу понять, как назвать эту функцию.

tmp() 

Недействителен VB синтаксис. Я получил это далеко, теперь, как я могу выполнить эту, казалось бы, простую задачу?

Edit: Позвонив

pyEngine.Operations.Invoke(tmp) 

Я могу вызвать функцию, и я вижу ожидаемый результат на стандартный вывод. У меня все еще создается впечатление, что есть какой-то тип-указатель типа, который я могу использовать для объектов типа PythonFunction, которые позволят мне напрямую вызвать temp без вызова механизма Python.

ответ

0

Не уверен, что это будет работать, но попробовать его отливки к типу действий:

DirectCast(tmp, Action)() 

Основываясь на комментарий, попробуйте это:

engine.ObjectOperations.Invoke(tmp, Nothing) 
+0

К сожалению, это не сработает. Я получаю исключение из «Невозможно передать объект типа« IronPython.Runtime.PythonFunction »для ввода« System.Action ».» – mjn12

+0

Теперь мы добираемся куда-то - у меня есть тип, с которым я могу работать. Обновление. –

+0

Ха, я только что обнаружил, что прямо перед тем, как я прокомментировал ваш пост. От чтения документации и просмотра примеров C# я чувствую, что должен уметь использовать tmp для вызываемого типа. См. Http://www.voidspace.org.uk/ironpython/dark-corners.shtml#delegates-and-calltarget0 – mjn12

0

VB в .NET 4 должен имеют ту же динамическую поддержку, что и C#. По http://msdn.microsoft.com/en-us/library/ee461504.aspx#Y5108 (в нижней части), вы должны быть в состоянии сделать:

Dim tmp As Object = scope.GetVariable("test") 

... что это то, что вы уже делаете, поэтому убедитесь, что вы ориентируетесь .NET 4.

Если это не работает, вы должны быть в состоянии бросить его с общей версией GetVariable:

Dim tmp As Action = scope.GetVariable(Of Action)("test") 

Наконец, вы уже открыли Invoke на ObjectOperations.

(Возможно, вам потребуется настроить синтаксис, так как я не знаю VB.)

 Смежные вопросы

  • Нет связанных вопросов^_^