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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
跟老齐学Python之做一个小游戏
Sep 28 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
浅谈python迭代器
Nov 08 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
python+flask实现API的方法
Nov 21 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
Apr 08 Python
利用python生成照片墙的示例代码
Apr 09 Python
什么是python的id函数
Jun 11 Python
python正则表达式re.search()的基本使用教程
May 21 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 伪造本地文件包含漏洞的代码
2011/11/03 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
django如何连接已存在数据的数据库
2018/08/14 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
django使用JWT保存用户登录信息
2020/04/22 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
大二自我鉴定
2014/01/31 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
解除同居协议书
2015/01/29 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
python解决12306登录验证码的实现
2021/04/18 Python