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


Posted in Python onJune 05, 2020

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()

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

Python 相关文章推荐
Python程序设计入门(2)变量类型简介
Jun 16 Python
python实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
python友情链接检查方法
Jul 08 Python
django基础之数据库操作方法(详解)
May 24 Python
一文总结学习Python的14张思维导图
Oct 17 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
对pandas中Series的map函数详解
Jul 25 Python
python3 下载网络图片代码实例
Aug 27 Python
python自动化UI工具发送QQ消息的实例
Aug 27 Python
python 实现汉诺塔游戏
Nov 28 Python
python中urllib包的网络请求教程
Apr 19 Python
Python 文字识别
May 11 Python
Python实现将元组中的元素作为参数传入函数的操作
Jun 05 #Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 #Python
python3检查字典传入函数键是否齐全的实例
Jun 05 #Python
Python使用20行代码实现微信聊天机器人
Jun 05 #Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 #Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 #Python
python3读取autocad图形文件.py实例
Jun 05 #Python
You might like
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
php实现多城市切换特效
2015/08/09 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
Javascript Global对象
2009/08/13 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
vue实现评论列表功能
2019/10/25 Javascript
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
Python持续监听文件变化代码实例
2020/07/22 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
优秀的教师个人的中文求职信
2013/09/21 职场文书
医学生个人求职信范文
2014/02/07 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
党支部公开承诺书
2014/03/28 职场文书
论文诚信承诺书
2014/05/23 职场文书
优质服务口号
2014/06/11 职场文书
关键在于落实心得体会
2014/09/03 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
公司年夜饭通知
2015/04/25 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
redis lua限流算法实现示例
2022/07/15 Redis