Python 3:如何从.net DLLPythonnet创建抽象类的实例以满足重载方法的签名

问题描述

我需要使用pythonnet从DLL调用方法。此方法期望使用特定类型的列表来填充返回的对象。经过一番研究后,我发现我只需要一个假人(即可满足签名)。

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 API\API")

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)

解决方法

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() 创建的