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+mysql实现简单的web程序
Sep 11 Python
Python实现的一个简单LRU cache
Sep 26 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 Python
Fabric 应用案例
Aug 28 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
python如何发布自已pip项目的方法步骤
Oct 09 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
python 数据库查询返回list或tuple实例
May 15 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 Python
python绘图subplots函数使用模板的示例代码
Apr 30 Python
教你使用TensorFlow2识别验证码
Jun 11 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
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python的词法分析与语法分析
2013/05/18 Python
python函数返回多个值的示例方法
2013/12/04 Python
Python Web服务器Tornado使用小结
2014/05/06 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
如何真正的了解python装饰器
2020/08/14 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
淘宝活动策划方案
2014/02/06 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
2016中秋节广告语
2016/01/28 职场文书
Python之matplotlib绘制饼图
2022/04/13 Python