Python.NET中使用msl.loadlib和DLL的System.NullReferenceException

2024-09-27 09:35:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个来自USB测量仪器的SDK,带有一个用Visual Basic编写的示例程序,但我想使用Python来控制仪器

我使用msl.loadlib中的LoadLibrary加载Python中的.net DLL

仪器响应良好,并按我的要求执行,但我在最后一行得到一个System.NullReferenceException,我不明白。有人有主意吗?可能是来自.NET的bug吗

代码:

from msl.loadlib import LoadLibrary
from time import sleep
import ctypes


class sekonic():
    
    def __init__(self, name):
        
        NET = LoadLibrary(r'C:\Users\Adrien Lucca\Desktop\WORKSPACE\mechelen\C7000_SDK_old.dll', 'net')
        
        self.name = name 
        self.lib = NET.lib.C7000.SDK(ctypes.c_ulong)

#the machine and its functions
device = sekonic("sek")

#connect to the machine
SDKResult = device.lib.SK_Connect() 
  
while (device.lib.SKF_STATUS_COM.SUCCESS != SDKResult):
    print("connection failed")
    print('try turning the C7000 ON')
    SDKResult = device.lib.SK_Connect()
print("connection established")

#initialize variables
MeasResult = device.lib.SKS_MEAS_RESULT()
Config = device.lib.SKS_MEAS_CONFIG()
DeviceInfo = device.lib.SKS_DEVICE_INFO()

#get info
SDKResult = device.lib.SK_GetDeviceInfo(DeviceInfo)
if (SDKResult[1].Status == 0):
    print ("IDLE")
if (SDKResult[1].Remote == 0):
    print ("REMOTE OFF")


#set remote
SDKResult = device.lib.SK_SetRemoteMode(1) 
  
while (device.lib.SKF_STATUS_COM.SUCCESS != SDKResult):
    print("set remote mode failed ")
    SDKResult = device.lib.SK_SetRemoteMode(1) 


#get info
SDKResult = device.lib.SK_GetDeviceInfo(DeviceInfo)
if (SDKResult[1].Status == 0):
    print ("IDLE")
if (SDKResult[1].Remote == 1):
    print ("REMOTE ON")


#configuration 
Params = device.lib.SK_GetMeasConfig(Config)

if (Params[1].MeasuringMode) != 0:
    Params[1].MeasuringMode= 0
if (Params[1].MeasuringMode) == 0:
    print("Measuring Mode: AMBIENT")
if (Params[1].FieldOfView) != 1:
    Params[1].FieldOfView = 1 
if (Params[1].FieldOfView) == 1:
    print("10deg Observer")
if (Params[1].ExposureTime) != 0:
    Params[1].ExposureTime = 0
if (Params[1].ExposureTime) == 0:
    print("AUTO exposure")
if (Params[1].MeasuringMethod) !=0:
    Params[1].MeasuringMethod = 0
if (Params[1].MeasuringMethod) ==0:
    print("SINGLE measurement mode")

#write new parameters
device.lib.SK_SetMeasConfig(Params[1])



#
# Start measurement 
#
Measurement = device.lib.SK_StartMeasuring()

i = 0
SDKResult = device.lib.SK_GetDeviceInfo(DeviceInfo)
if (SDKResult[1].Status==3):
    print("MEASURING")

while SDKResult[1].Status == 3:

    sleep(.1)

    SDKResult = device.lib.SK_GetDeviceInfo(DeviceInfo)

    if(i>=10000):
        print("error waiting 100s")
        break 
    i += 1

if (SDKResult[1].Status == 0):
    print ("IDLE")
    
#get the measurement results
#HERE IT CRASHES
#System.NullReferenceException: La reference d'objet n'est pas definie a une instance d'un objet.
SDKResult = device.lib.SK_GetMeasuringResult(MeasResult)

返回:

connection established
IDLE
IDLE
REMOTE ON
Measuring Mode: AMBIENT
10deg Observer
AUTO exposure
SINGLE measurement mode
MEASURING
IDLE

Traceback (most recent call last):
  File "C:\Users\Adrien Lucca\Desktop\WORKSPACE\mechelen\SekoniC7000.py", line 125, in <module>
    SDKResult = device.lib.SK_GetMeasuringResult(MeasResult)
System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.
   à C7000.SDK.SK_GetMeasuringResult(SKS_MEAS_RESULT& MeasResult)

Tags: theifdevicelibstatussdkparamssk

热门问题