从托管Iron Python的VB应用程序调用PythonFunction

时间:2012-04-17 12:53:48

标签: vb.net scripting ironpython dynamic-language-runtime hosted

我是一名C ++编程人员,他曾在Visual Basic中编写一个小应用程序。该应用程序托管IronPython运行时,我试图在python中定义一些函数,然后从VB调用它们。我在python中编写了一个简单的测试函数

def test(): 
    print "Test was Called"

然后我使用iron python从python文件创建一个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)

在我的代码中,tmp被定义为PythonFunction类型的对象。我无法弄清楚如何调用此函数。

tmp()

无效的VB语法。我已经走到了这一步,现在我该如何执行这个看似简单的任务呢?

编辑:通过调用

 pyEngine.Operations.Invoke(tmp)

我可以调用该函数,并在stdout中看到预期的输出。我仍然认为有一些类似函数指针的类型,我可以将类型为PythonFunction的对象转换为允许我直接调用temp而不调用Python引擎。

2 个答案:

答案 0 :(得分:0)

不确定这会有效,但请尝试将其转换为Action类型:

DirectCast(tmp, Action)()

根据评论,试试这个:

engine.ObjectOperations.Invoke(tmp, Nothing)

答案 1 :(得分:0)

VB 4中的VB应该具有与C#相同的动态支持。根据{{​​3}}(靠近底部),您应该能够:

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

...这就是您已经在做的事情,所以请确保您定位.NET 4。

如果这不起作用,您应该能够使用GetVariable的通用版本进行投射:

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

最后,您已经在ObjectOperations上发现了Invoke

(您可能需要调整语法,因为我不了解VB。)