首页 > 解决方案 > Python 3:如何从 .net DLL (Pythonnet) 创建抽象类的实例,(以满足重载方法的签名)

问题描述

我需要使用 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)

标签: python-3.xpython.net

解决方案


DaqEnvironment.Connect() 需要一个 C# List 作为第二个参数。这可以这样做:

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


推荐阅读