Python调用.net动态库实现过程解析

时间:2021-05-23

pythonnet简介

  • pythonnet是cpython的扩展
  • pythonnet提供了cpython和.net程序集之间交互的桥梁
  • pythonnet开源在github上

pythonnet安装

通过pip install pythonnet安装

pythonnet的使用帮助

pythonnet的使用帮助,请参见github.

pythonnet中的坑

cpython是分32和64位的,对应的pythonnet也是分的,版本要对应好
pythonnet最核心的就是python.Runtime.dll动态库,这个库是c#编写的实现了两种语言的交互

ref类型的参数如何返回

  • 返回值的第一个元素是c#的返回值
  • 返回值的第二个元素就是ref的值了,ref String[] 对应的返回值第二个元素就是元组tuple

如何加载动态库

# clr是公共运行时环境,该模块是与c#交互的核心import clrimport sys# 导入clr时这个模块最好也一起导入,这样可用使用AddReference()方法import System# input()from System import Arrayfrom System import String# 打印当前.net运行时的版本print(System.Environment.Version)# 打印当前的环境变量print('---------------------')for p in sys.path: print(p)print('---------------------')# 加载动态,不要带动态库的后缀名,如果d=None,表示动态库没有找到d = clr.FindAssembly('YctxKj.Card.Interpreter')print(d)# from后面跟的是动态库的名字,不是命名空间from YctxKj.Card.Interpreter import *d = clr.FindAssembly('YctxKj.Card.CardReader')print(d)from YctxKj.Card import CardReader# 打印程序集,如果动态库加载成功,程序集里就会含有动态库的程序集lt = clr.ListAssemblies(False)for i in range(lt.Length): print('%d = %s' % (i,lt[i]))ret = 0# 程序调用业务代码_reader = CardReader()_Interpreter = ScriptInterpreter()_Interpreter._reader = _reader_Interpreter.Init();ret = _Interpreter.SetKeyMode(305)print('ret=%d' % ret)arCarder = ''# input() 可以程序暂停,然后使用vs附加进程python.exe调试# input()ret = _reader.ListReader(arCarder);print('ret = %d' % ret[0])print('ref param string[] length = %d' % ret[1].Length)if ret[1].Length > 0: items = ret[1] for t in items: print(t)else: print('don\'t find cardreader dev') exit()# 链接读卡器strReader = items[1]strATR = ''nRet = _reader.Connect(strReader, strATR)if nRet[0] != 0: print('connect card fail, nRet=%d' % nRet[0]) _reader.Beep() _reader.Beep() exit()print('crd connect successed,atr=%s' % nRet[1])_reader.Beep()# 断开读卡器_reader.Disconnect()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章