歡迎您光臨本站 註冊首頁

Python調用.net動態庫實現過程解析

←手機掃碼閱讀     hongdian2012 @ 2020-06-08 , reply:0

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

  


[hongdian2012 ] Python調用.net動態庫實現過程解析已經有470次圍觀

http://coctec.com/docs/python/shhow-post-237478.html