Python调用C# Com dll组件实战教程


Posted in Python onOctober 12, 2017

之前公司有套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,点击【确定】

Python调用C# Com dll组件实战教程

重命名cs文件:ComToPython.cs,可自定义。 弹窗选择【是】

Python调用C# Com dll组件实战教程

COM可见性设置为 True:

Python调用C# Com dll组件实战教程

上面等同于以下项目属性设置:

Python调用C# Com dll组件实战教程

勾选“为COM互操作注册”:

Python调用C# Com dll组件实战教程

新建签名ComToPythonKey,取消勾选 “使用密码保护密钥文件”

Python调用C# Com dll组件实战教程

编写接口类IMyClass,ComToPython类实现接口的三个方法,例如Add()方法就是我们想要实现的功能,返回a与b之和。

ComToPython类之前的[ClassInterface(ClassInterfaceType.None)]一定要有,否则Python调用时会报错。

[ProgId("ComToPython.Application")]指定Python调用COM时的名称,后面Python代码会看到。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
 
namespace ComToPython
{
  [Guid("350779B9-8AB5-4951-83DA-4CBC4AD860F4")]
  public interface IMyClass
  {
    void Initialize();
    void Dispose();
    int Add(int x, int y);
  }
 
  [ClassInterface(ClassInterfaceType.None)]
  [Guid("16D9A0AD-66B3-4A8A-B6C4-67C9ED0F4BE4")]
  [ProgId("ComToPython.Application")]
  public class ComToPython: IMyClass
  {
    public void Initialize()
    {
      // nothing to do 
    }
 
    public void Dispose()
    {
      // nothing to do 
    }
 
    public int Add(int x, int y)
    {
      return x + y;
    }
  }
}

GUID使用VS2010自带工具生成,工具--创建GUID,点击复制两个GUID分别放至两个类名之前

Python调用C# Com dll组件实战教程

注:点击新建GUID,可复制新建后的GUID:

Python调用C# Com dll组件实战教程

最后F6编译生成解决方案,在你的工程Debug目录下会有ComToPython.dll生成:

Python调用C# Com dll组件实战教程

最后一步注册COM组件至系统

开始菜单--打开VS 2010 自带CMD命令窗口(管理员权限)定位至ComToPython.dll文件夹下

执行:gacutil /i ComToPython.dll 添加dll至全局缓存

执行:regasmComToPython.dll 注册dll至系统

Python调用C# Com dll组件实战教程

2.Python如何调用COM dll组件

我用的是Python 2.7,IDE用的PyCharm 2017.1,PyCharm新建--项目ComToPython,新建项目py文件ComToPython.py

设置--添加两个依赖库:

Python调用C# Com dll组件实战教程

添加安装pywin32和comtypes依赖库,以对应后面的两种调用COM组件方式:

Python调用C# Com dll组件实战教程

依赖装好后,Python安装目录site-packages目录下会有个win32com文件夹,双击C:\Python27\Lib\site-packages\win32com\client\下的makepy.py

选择ComToPython,点击OK

Python调用C# Com dll组件实战教程

然后拷贝上面VS2010生成的COM组件ComToPython.dll至PyCharm ComToPython项目文件夹下:

Python调用C# Com dll组件实战教程

编写python调用COM dll代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
a=1
b=2
print "方法一:"
from win32com.client import Dispatch
dll = Dispatch("ComToPython.Application")
result = dll.Add(a, b)
print "a + b = " + str(result)

print "方法二:"
import comtypes.client
dll = comtypes.client.CreateObject('ComToPython.Application')
result = dll.Add(a, b)
print "a + b = " + str(result)

运行代码,执行结果如下:

Python调用C# Com dll组件实战教程

以上就是Python调用C# COM Dll整个过程了

这篇Python调用C# Com dll组件实战教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python脚本实现分析dns日志并对受访域名排行
Sep 18 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
python多个模块py文件的数据共享实例
Jan 11 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
深入了解Django中间件及其方法
Jul 26 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
Python unittest框架操作实例解析
Apr 13 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 #Python
Python实现曲线点抽稀算法的示例
Oct 12 #Python
python去除字符串中的换行符
Oct 11 #Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 #Python
Windows系统下多版本pip的共存问题详解
Oct 10 #Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 #Python
遗传算法之Python实现代码
Oct 10 #Python
You might like
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
Python中类的继承代码实例
2014/10/28 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
利用Python获取操作系统信息实例
2016/09/02 Python
python获取list下标及其值的简单方法
2016/09/12 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
Python中的引用知识点总结
2019/05/20 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
英语专业毕业个人求职自荐信
2013/09/21 职场文书
成教毕业生自我鉴定
2013/10/23 职场文书
施工安全协议书
2013/12/11 职场文书
初三化学教学反思
2014/01/23 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
酒店前台岗位职责
2015/04/16 职场文书
教师节作文之小学四年级
2019/09/03 职场文书