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

### 参考文章
-----------------------------
- [python与c#的交互模块pythonnet](https://www.cnblogs.com/tester-zhenghan/p/5406521.html)
- [pythonnet主页](https://github.com/pythonnet/pythonnet)

python调用.net动态库的更多相关文章

  1. python 调用 C 动态库

    首先是 C 的头文件和源文件, #ifndef POINT_H #define POINT_H struct point { int x; int y; }; void point_print(str ...

  2. 使用ctypes在Python中调用C++动态库

    使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...

  3. c#调用c++动态库的一些理解

    调用c++动态库一般我们这样写   [DllImport("UCamer.dll", CallingConvention = CallingConvention.Winapi)] ...

  4. C#调用C++动态库(dll)

    在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用re ...

  5. C#总结(四)调用C++动态库

    由于公司很多底层的SDK,都是C++开发,上层的应用软件却是C# Winform程序.在实际工作的过程中,就经常碰到了C# 程序调用C++ 动态库的问题.最近一直在和C++ 打交道,C# 怎么调用C+ ...

  6. Java调用dll动态库

    最近项目里使用java调用dll动态库,因此研究了一下这方面的东西. 使用的工具包如下 <dependency> <groupId>net.java.dev.jna</g ...

  7. 【C#】 使用Gsof.Native 动态调用 C动态库

    [C#] 使用Gsof.Native 动态调用 C动态库 一.背景 使用C# 开发客户端时候,我们经常会调用一些标准的动态库或是C的类库.虽然C# 提供的PInvoke的方式,但因为使用的场景的多变, ...

  8. Delphi XE7调用C++动态库出现乱码问题回顾

    事情源于有个客户需使用我们C++的中间件动态库来跟设备连接通讯,但是传入以及传出的字符串指针格式都不正确(出现乱码或是被截断),估计是字符编码的问题导致.以下是解决问题的过程: 我们C++中间件动态库 ...

  9. C# 调用C++动态库注意事项

    C# 调用C++动态库注意事项 最近项目上需要在C#中调用C++,期间遇到不少坑,总结如下: 1.in const char*   对应C#中string 或  IntPtr 2.out const ...

随机推荐

  1. O'Reilly总裁提姆-奥莱理:什么是Web 2.0

    O'Reilly总裁提姆-奥莱理:什么是Web 2.0 译者序:Web 2.0这一概念,由O'Reilly媒体公司总裁兼CEO提姆·奥莱理提出.他是美国IT业界公认的传奇式人物,是“开放源码”概念的缔 ...

  2. 树莓派进阶之路 (006) - 树莓派安装wiringPi

    安装git-core sudo apt-get install git-core 下载winringPi库 git clone git://git.drogon.net/wiringPi 编译和安装库 ...

  3. fedora国内源常见配置

    yum install yum-fastestmirror3.rpmfusion源 rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfus ...

  4. 系统服务中没有Windows Installer服务怎么办

    在安装软件时,发现安装不了,提示没有Windows Installer服务,到系统服务中一看,果真没有这一项,这是什么问题呢? 出现这种情况,多为与Windows Installer服务相关的文件丢失 ...

  5. maven最全教程

    Maven 教程 1.Maven概述 Maven 是什么? Maven 是一个项目管理和整合工具.Maven 为开发者提供了一套完整的构建生命周期框架.开发团队几乎不用花多少时间就能够自动完成工程的基 ...

  6. C#创建文件夹并设置权限

    原文地址:https://www.cnblogs.com/top5/archive/2010/04/12/1710141.html /*  需要添加以下命名空间:  using System.IO;  ...

  7. Xcode command line tools

    1.Xcode command line tools 安装 如果你不是一名 iOS 或 OS X 开发者,可以跳过安装 XCode 的过程,直接安装 Xcode command line tools. ...

  8. Oracle 12C -- shutdown CDB

    SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ------------------------------ ---------- ...

  9. iOS Terminating app due to uncaught exception &#39;NSInternalInconsistencyException&#39;, reason: &#39;unable to

    刚接触iOS,依照教程操作执行出现错误 Terminating app due to uncaught exception 'NSInternalInconsistencyException', re ...

  10. eclipse热部署配置

    1. 方法一 打开server.xml,找到 比对下:改成下面这样: <Context docBase="dreamlive" path="/ROOT"  ...