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 clr import sys # 导入clr时这个模块最好也一起导入,这样可用使用AddReference()方法 import System # input() from System import Array from 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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)