Python调用.net动态库实现过程解析
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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章: