首页 > 解决方案 > 没有调用泛型的 Pythonnet 委托方法

问题描述

我正在使用带有 Pythonnet 的 Python 脚本来驱动 C# 库。这个库在某些事件上触发委托方法。我正在注册委托方法,但没有被调用。

有问题的方法定义为event EventHandler<EventArgs> SystemInformationUpdated

有趣的是,正在调用另一个具有自定义类返回值的方法,定义为event EventHandler<PeripheralDiscoveredEventArgs> PeripheralDiscovered

当我使用 IronPython 运行这段代码时,一切正常,所以我认为这是 PythonNET 的问题。我的代码是这样的:

from System import EventHandler, EventArgs

(...)

dc = EventHandler[PeripheralDiscoveredEventArgs](centralOnPeripheralDiscovered_callback)
central.PeripheralDiscovered += dc

iuc = EventHandler[EventArgs](systemInformationUpdated_callback)
central.SystemInformationUpdated += iuc

调用函数systemInformationUpdated_callback时未执行。centralOnPeripheralDiscovered_callback

我还尝试了以下代码:

from System import EventArgs

(...)

EventHandler = getattr(System, 'EventHandler`1')
dc = EventHandler[PeripheralDiscoveredEventArgs](centralOnPeripheralDiscovered_callback)
central.PeripheralDiscovered += dc

EventHandler = getattr(System, 'EventHandler`1')
iuc = EventHandler[EventArgs](systemInformationUpdated_callback)
central.SystemInformationUpdated += iuc

它也不起作用(因为我相信该错误已在 PythonNET 2.2 中得到纠正)。

使用我得到的控制台

dc
<0, Culture=neutral, PublicKeyToken=null]]>
iuc
<0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]>

iuc对象 Target 属性是

Target  <__System_EventHandler`1\[\[System_EventArgs\, mscorlib\, Version=4_0_0_0\, Culture=neutral\, PublicKeyToken=b77a5c561934e089\]\]Dispatcher>    __System_EventHandler`1\[\[System_EventArgs\, mscorlib\, Version=4_0_0_0\, Culture=neutral\, PublicKeyToken=b77a5c561934e089\]\]Dispatcher

我也看了

环境:

非常感谢!

标签: c#pythongenericsdelegatespython.net

解决方案


通过进一步的测试,我意识到回调正在被调用,抱歉哭狼。我的回调如下:

def systemInformationUpdated_callback(sender, e):
    global central
    pdict = dict(central.SystemInformation)
    print "System Information:"
    for key, value in pdict.iteritems():
        print "    "+key+" = "+value

central.SystemInformation是一个IDictionary<string, string>。问题是 PythonNET 不会直接从中创建字典,罪魁祸首是这一行

pdict = dict(central.SystemInformation)

但这会悄无声息地爆炸,不会抛出异常,System Information:也不会打印字符串。所以我认为回调永远不会被调用。

请注意,此代码在 IronPython 上运行良好。

谢谢!!


推荐阅读