Python 3: Как создать экземпляр абстрактного класса из .net DLL (Pythonnet), (для удовлетворения подписи перегруженных методов)

#python-3.x #python.net

#python-3.x #python.net

Вопрос:

Мне нужно вызвать метод из DLL с помощью pythonnet. Этот метод ожидает, что список определенного типа заполнит возвращаемые объекты. После некоторых исследований я нашел подсказку, что мне нужен только фиктивный (для удовлетворения подписи).

https://www.adrian.idv.hk/2018-08-15-pythonnet/

Итак, мне нужен фиктивный объект. К сожалению, класс является абстрактным классом, поэтому я не могу вызвать конструктор. Здесь мне нужна помощь, как я могу вызвать метод. clr.GetClrType() не помогло, он вернул System.RuntimeType вместо ожидаемого типа класса…

Приведенный здесь код предназначен только для информации:

 import sys
import clr
import ctypes

#change the sys.path
sys.path.insert(1,"D:HBM Common APIAPI")

clr.AddReference("Hbm.Api.Common")
from Hbm.Api.Common import DaqEnvironment
from Hbm.Api.Common.Entities import Device
from Hbm.Api.Common.Entities.Problems import CommunicationFailedError
from Hbm.Api.Common.Entities.Channels import Channel
from Hbm.Api.Common.Entities.Problems import Problem

from Hbm.Api.Common.Enums import SettingType
from Hbm.Api.Common.Enums import LedFlashMode

clr.AddReference("Hbm.Api.QuantumX")
from Hbm.Api.QuantumX import QuantumXDevice
from Hbm.Api.QuantumX import QuantumXDeviceFamily


inst = DaqEnvironment.GetInstance()  # there is no constructor for the environment
deviceList = inst.Scan()

#quantum = QuantumXDevice("10.10.10.100")
quantumFamily = QuantumXDeviceFamily()
retDevices = quantumFamily.Scan()
quantum = retDevices[0]

print('Yipiih: QuantumX Found: HW Number: '   quantum.SerialNo)

#Problem = Problem()  # this is not possible as it is an abstract class
typeProb = clr.GetClrType(Problem)
dummyProb = typeProb()

#call the Connect Method:
connected, retList = DaqEnvironment.Connect(retDevices[0], typeProb)
  

Ответ №1:

DaqEnvironment.Connect() нуждается в списке C # в качестве второго аргумента. Это можно сделать следующим образом:

     clr.AddReference("System.Collections")
    from System.Collections.Generic import List
    from Hbm.Api.Common.Entities.Problems import Problem

    connect_problems = List[Problem]()
    is_ok = env.Connect(found_devices[0], connect_problems)
  

found_devices был создан путем вызова DaqEnvironment .Scan()