Как подписать функцию python на метод делегата C # .Net с помощью pythonnet?(TypeError: неподдерживаемые типы операндов) - PullRequest
1 голос
/ 27 июня 2019

Я не могу подписать свою функцию python на метод делегата внутри DLL-файла библиотеки, написанного на c # net.

Эта библиотека написана для связи с устройством.Я успешно импортирую библиотеку через pythonnet.Я могу использовать некоторые методы библиотеки, такие как отправка команд, получение базовой информации об устройстве и т. Д.

В Visual Studio определение метода делегата в обозревателе объектов выглядит следующим образом:

public : System::EventHandler<LibOfMyDevice::BasicInfo^>^ BasicInfoChanged
Member of LibOfMyDevice::OneDevice

В примере на C я могу подписаться так:

Device.BasicInfoChanged += BasicInfoChanged;
...
private void BasicInfoChanged(object sender, BasicInfo info) {
    if (InvokeRequired)
        Invoke(new Action<BasicInfo>(HandleBasicInfoChanged), info);
    else
        HandleBasicInfoChanged(info);
    }
...
private void HandleBasicInfoChanged(BasicInfo info) {
    switch (info.Status) {
        // do something
    }
}

В примере на C ++ я могу подписаться так:

device->BasicInfoChanged += gcnew EventHandler<LibOfMyDevice::BasicInfo^>(this, &MyForm::BasicInfoChanged);
...
void BasicInfoChanged(System::Object^ sender, LibOfMyDevice::BasicInfo^ info) {
    if (info->Status== LibOfMyDevice::BasicInfo::Status::Connected) { 
        // do something         
    }
}

Пока я пробовал это на python без успеха:

import clr
...
def my_python_handler(sender, info):
    print(sender, info)


# try 1)
# eventHandler = getattr(System, 'EventHandler`1')
# dc = EventHandler[BasicInfo](my_python_handler)
# device.BasicInfoChanged += dc
#
# >>> TypeError: unsupported operand type(s) for +=: 'NoneType' and '0, Culture=neutral, PublicKeyToken=null]]'

# try 2)
# action = getattr(System, "Action`1")
# dc = Action[BasicInfo](my_python_handler)
# device.BasicInfoChanged += dc
# 
# >>> TypeError: unsupported operand type(s) for +=: 'NoneType' and '0, Culture=neutral, PublicKeyToken=null]]'

# try 3)
# device.BasicInfoChanged += EventHandler[BasicInfo](Action[str](my_python_handler))
#
# >>> TypeError: unsupported operand type(s) for +=: 'NoneType' and '0, Culture=neutral, PublicKeyToken=null]]'

# try 4)
# iuc = EventHandler[EventArgs](my_python_handler)
# device.BasicInfoChanged += iuc
#
# >>> TypeError: unsupported operand type(s) for +=: 'NoneType' and '0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'

# try 5)
# eventhandler = EventHandler[BasicInfo](my_python_handler)
# device.BasicInfoChanged += eventhandler
#
# >>> TypeError: unsupported operand type(s) for +=: 'NoneType' and '0, Culture=neutral, PublicKeyToken=null]]'

# try 6)
# device.BasicInfoChanged += Action[str](my_python_handler)
#
# >>> TypeError: unsupported operand type(s) for +=: 'NoneType' and '0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'

Как мне к этому подойти?

...