1

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

def test(): 
    print "Test was Called"

然后我使用 Iron python 从 python 文件创建一个 ScriptSource。我可以通过对象操作查找“测试”变量,但我不知道如何调用该对象。例如(在 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)

我能够调用该函数,并且在标准输出中看到了预期的输出。我仍然觉得有一些类似函数指针的类型,我可以将 PythonFunction 类型的对象强制转换为它,这样我就可以直接调用 temp 而无需调用 Python 引擎。

4

2 回答 2

0

不确定这是否可行,但请尝试将其转换为 Action 类型:

DirectCast(tmp, Action)()

根据评论,试试这个:

engine.ObjectOperations.Invoke(tmp, Nothing)
于 2012-04-17T13:38:04.947 回答
0

.NET 4 中的 VB 应该具有与 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。)

于 2012-04-17T15:28:43.317 回答