2

对于一个项目,我需要在 Python 中包含一个 DLL。我正在使用 CPython3.4 并包含我使用 pythonnet clr 模块(pythonnet-2.0.0.dev1-cp34-none-win_amd64.whl)的 dll。在 dll 中,我需要一个能够持续更新测量值的函数。该dll是用VB.net编写的,我需要的函数如下所示:

Public Sub AdviseStart(ByVal item As Integer, ByVal a As Action(Of Object)) Implements IConversation.AdviseStart
    _parameterPoller.RegisterCallback(item, a)
End Sub

这是我用python编写的调用这个函数的代码:

import clr
clr.AddReference('dll name')
from dll import SetupMonitor

monitor = SetupMonitor(None, None, None)

# call to the dll function
# Everytime the measurement is changed the "test" function should be executed
monitor.AdviseStart(8, test)

def test(data):
    print("Value: " + str(data))   

为了我的进一步项目,我想使用 Python3.4 而不是 Ironpython。我在 python3.4 和 2.7 中测试了这段代码,我得到了这个错误:

No method matches given arguments

我 100% 确定错误来自 AdviseStart 函数。因为当我对 IronPython 使用相同的代码时,它可以工作。在 Ironpython 中,这段代码给出了我期望的输出:

Value: -74

该函数的目标是每次进行新的测量时都会调用函数“test”。测量和调用的一切都在 dll 中。无论如何我可以让这个函数在任何 CPython 版本中工作吗?

4

1 回答 1

1

在 64 位版本中,整数参数存在一些问题。据我所知,特定问题已经解决,但它应该是在您使用的版本发布之后。

尝试从 github ( https://github.com/renshawbay/pythonnet ) 获取源代码并构建它。要构建和安装它,您只需运行“python setup.py install”(或任何常用的 setup.py 命令)。

如果它仍然不起作用,您可以通过在 setup.py 中设置 CONFIG="Debug" 并重新构建来构建调试版本。然后,您将能够将 Visual Studio 调试器附加到您的 python 进程并逐步执行 python.net 代码以查看它找到了哪些签名以及为什么它与您调用它的参数不匹配。

于 2015-04-14T15:59:18.323 回答