我是一名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引擎。
答案 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。)