Метод делегата Pythonnet с непатентованными обобщениями - PullRequest
0 голосов
/ 02 октября 2018

Я использую скрипт Python с Pythonnet для управления библиотекой C #.Эта библиотека запускает методы делегата для определенных событий.Я регистрирую метод делегата, но он не вызывается.

Данный метод определен как event EventHandler<EventArgs> SystemInformationUpdated

Самое смешное, что другой метод с пользовательским классом возвращает значениеIS вызывается, определяется как 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 - это NOT , выполняемый во время вызова функции 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 object 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

Я посмотрел Python для .NET readme: Использование Generics , Невозможно использовать Generics в CPython с Python.NET , Как я могу заставить дженерики работать в Python.NET с CPython

Среда:

  • Python 3.6 64 бит,
  • PythonNET2.3.0
  • .NET Framework 4.5.2
  • Windows 7 Enterprise 64 бит

Большое спасибо!

1 Ответ

0 голосов
/ 04 октября 2018

При дальнейшем тестировании я понял, что callback вызывается, извините, чтобы плакать волк.Мой обратный вызов выглядит следующим образом:

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.

Спасибо !!

...