之前公司有套C# AES加解密方案,但是方案加密用的是Rijndael類,而非AES的四種模式(ECB、CBC、CFB、OFB,這四種用的是RijndaelManaged類),Python下Crypto庫AES也只有這四種模式,進而Python下無法實現C# AES Rijndael類加密效果了。
類似於這種C# 能實現的功能而在Python下實現不了的,搜集資料有兩種解決方案,第一種方式,使用IronPython 直接調用C# dll文件,教程網上很多,不在贅述了,這種方式有個缺點,用的是ironPython而非Python,只是集成了一些.net framework庫的Python版本,更新維護少;第二種方式是,C# dll源碼編譯成Com組件,Python再調用COM組件Dll的方法。
網上有很多Python調用COM dll教程,但大部分是C或C++編寫的dll,很少有比較全面的講解COM組件生成至調用過程,下面結合自己摸索多天的經歷,簡單介紹下如何生成COM組件,以及用Python如何調用COM dll組件,分享給大家。
我也是小白 ……^ ^,高手請飄過,如有寫的不對之處,還請多多包涵以指正...
1.如何生成C# COM組件
我用的是Microsoft visual studio 2010, 首先新建--項目--選擇【類庫】,名稱自定義:ComToPython,點擊【確定】
重命名cs文件:ComToPython.cs,可自定義。 彈窗選擇【是】
COM可見性設置為 True:
上面等同於以下項目屬性設置:
勾選“為COM互操作注冊”:
新建簽名ComToPythonKey,取消勾選 “使用密碼保護密鑰文件”
編寫接口類IMyClass,ComToPython類實現接口的三個方法,例如Add()方法就是我們想要實現的功能,返回a與b之和。
ComToPython類之前的[ClassInterface(ClassInterfaceType.None)]一定要有,否則Python調用時會報錯。
[ProgId("ComToPython.Application")]指定Python調用COM時的名稱,后面Python代碼會看到。
1 using System; 2 3 using System.Collections.Generic; 4 5 using System.Linq; 6 7 using System.Text; 8 9 using System.Runtime.InteropServices; 10 11 12 13 namespace ComToPython 14 15 { 16 17 [Guid("350779B9-8AB5-4951-83DA-4CBC4AD860F4")] 18 19 public interface IMyClass 20 21 { 22 23 void Initialize(); 24 25 void Dispose(); 26 27 int Add(int x, int y); 28 29 } 30 31 32 33 [ClassInterface(ClassInterfaceType.None)] 34 35 [Guid("16D9A0AD-66B3-4A8A-B6C4-67C9ED0F4BE4")] 36 37 [ProgId("ComToPython.Application")] 38 39 public class ComToPython: IMyClass 40 41 { 42 43 public void Initialize() 44 45 { 46 47 // nothing to do 48 49 } 50 51 52 53 public void Dispose() 54 55 { 56 57 // nothing to do 58 59 } 60 61 62 63 public int Add(int x, int y) 64 65 { 66 67 return x + y; 68 69 } 70 71 } 72 73 }
GUID使用VS2010自帶工具生成,工具--創建GUID,點擊復制兩個GUID分別放至兩個類名之前
注:點擊新建GUID,可復制新建后的GUID:
最后F6編譯生成解決方案,在你的工程Debug目錄下會有ComToPython.dll生成:
最后一步注冊COM組件至系統
開始菜單--打開VS 2010 自帶CMD命令窗口(管理員權限)定位至ComToPython.dll文件夾下
執行:gacutil /i ComToPython.dll 添加dll至全局緩存
執行:regasmComToPython.dll 注冊dll至系統
2.Python如何調用COM dll組件
我用的是Python 2.7,IDE用的PyCharm 2017.1,PyCharm新建--項目ComToPython,新建項目py文件ComToPython.py
設置--添加兩個依賴庫:
添加安裝pywin32和comtypes依賴庫,以對應后面的兩種調用COM組件方式:
依賴裝好后,Python安裝目錄site-packages目錄下會有個win32com文件夾,雙擊C:\Python27\Lib\site-packages\win32com\client\下的makepy.py
選擇ComToPython,點擊OK
然后拷貝上面VS2010生成的COM組件ComToPython.dll至PyCharm ComToPython項目文件夾下:
編寫python調用COM dll代碼:
1 #!/usr/bin/env python 2 3 # -*- coding: utf-8 -*- 4 5 a=1 6 7 b=2 8 9 10 11 print "方法一:" 12 13 from win32com.client import Dispatch 14 15 dll = Dispatch("ComToPython.Application") 16 17 result = dll.Add(a, b) 18 19 print "a + b = " + str(result) 20 21 22 23 print "方法二:" 24 25 import comtypes.client 26 27 dll = comtypes.client.CreateObject('ComToPython.Application') 28 29 result = dll.Add(a, b) 30 31 print "a + b = " + str(result)
運行代碼,執行結果如下:
以上就是Python調用C# COM Dll整個過程了
第一篇博文,多謝支持~~~