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抓取网页内容示例分享
Feb 24 Python
python对json的相关操作实例详解
Jan 04 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
Python内置异常类型全面汇总
May 28 Python
Python定义一个函数的方法
Jun 15 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
分享php多功能图片处理类
2016/05/15 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
2014/01/27 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
jquery常用操作小结
2014/07/21 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
从Python程序中访问Java类的简单示例
2015/04/20 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
python3 shelve模块的详解
2017/07/08 Python
理论讲解python多进程并发编程
2018/02/09 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
甜美蛋糕店创业计划书
2014/01/30 职场文书
志愿者活动总结范文
2014/04/26 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
小学教师党员承诺书
2015/04/27 职场文书
员工离职证明范本
2015/06/12 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL