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解析json实例方法
Nov 19 Python
python双向链表实现实例代码
Nov 21 Python
Python学习笔记之常用函数及说明
May 23 Python
Python实现从百度API获取天气的方法
Mar 11 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
python 实现删除文件或文件夹实例详解
Dec 04 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
Django学习笔记之ORM基础教程
Mar 27 Python
Python切片索引用法示例
May 15 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
global.php
2006/12/09 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
Dom与浏览器兼容性说明
2010/10/25 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
ionic3 懒加载
2017/08/16 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
python在指定目录下查找gif文件的方法
2015/05/04 Python
python+Django+apache的配置方法详解
2016/06/01 Python
Python如何获取系统iops示例代码
2016/09/06 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
python 导入数据及作图的实现
2019/12/03 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
物流专员岗位职责
2014/02/17 职场文书
诚信考试倡议书
2014/04/15 职场文书
运动员获奖感言
2014/08/15 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
支行行长竞聘报告
2014/11/06 职场文书
教师工作态度自我评价
2015/03/05 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书